如何检查数据库中是否已存在某个表?

3
现在我正在使用类似以下的内容:
IF (object_id('table', 'U') is not null)  
AND (NOT EXISTS (SELECT * FROM [table] WHERE id = 0))  
    RETURN; 

我想检查我的数据库中是否已经存在这个“表”,但是如果当前数据库中没有这样的表,运行脚本时我会得到以下错误消息:

Msg 208, Level 16, State 1, Line 5
Invalid object name 'table'.

这是检查表在数据库中是否存在的正确方式吗?还是我必须更改SQL Management Studio的某些设置?

回答:我更改了我的脚本,一切正常运行:

IF (object_id('table', 'U') is not null)  
    IF (NOT EXISTS (SELECT * FROM [table] WHERE id = 0))  
        RETURN;  

2
整个脚本是什么?if (object_id('tablex', 'U') is not null) begin select * from tablex end对我有用吗? - Martin Smith
脚本已更新。 - SKINDER
你需要将表格的使用放入不同的语句中。 - Martin Smith
6个回答

2
IF EXISTS (SELECT * 
           FROM sys.objects 
           WHERE object_id = OBJECT_ID(N'table') 
           AND type in (N'U'))

我遇到了类似的问题,进行以下查询可以解决。 N 只是表示 Unicode。


据我所知,这种方法与 OP 的方法相比没有任何好处,只是更加冗长。 - Martin Smith
@Martin 是的,它只是更冗长了一些。 - msarchet

2
if (object_id('tablex', 'U') is not null) 
begin 
select * from tablex  
end

这段话的意思是:“对我来说可以工作。如果表不存在,那么编译该语句应该被延迟(假设你使用的是SQL Server 2005+)。如果你在除了if语句之后立即引用该表以外的任何语句中引用它,你需要使用begin...end语句块。”
“更新:你需要使用……”后面没有给出具体内容,无法翻译。
IF (object_id('table', 'U') is not null)
    IF (NOT EXISTS (SELECT * FROM [table] WHERE id = 0))
       RETURN; 

您现有的语句无法直接编译。整个语句都会被编译,即使之前已经推迟了语句的编译,所有对象必须在那一点上存在。
此外,在任何情况下,SQL Server 都不能保证进行短路评估。

1

这可能对你更有效

if (object_id('table', 'U') is not null)
  if not exists (SELECT * FROM [table] WHERE id = 0)

0

你可以像这样做:

IF (EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE='BASE TABLE' 
    AND TABLE_NAME='QRTZ_JOB_DETAILS'))
    BEGIN
    PRINT 'EXISTS'
    END

其中TABLE_NAME是您想在数据库中检查的表名。

更新:

如果您正在使用SQL SERVER 2000+,那么msarchet的答案更为合适。


0

这是许多方法中的一种。

   IF EXISTS (SELECT 1 
        FROM sysobjects 
        WHERE xtype='u' AND name='tablename') 
            SELECT 'tablename exists.' 
    ELSE 
            SELECT 'tablename does not exist.' 

0

我认为你提供了表名 [Table],如果是这样,请尝试将其更改为其他名称。然后它应该可以正常工作。然后上面的所有答案都将正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接