1

我对这段 SQL 代码失去了理智。下面的 IF ELSE 语句在使用简单 PRINT 语句进行测试时正常运行,即该表不存在,因此它打印“FALSE”。但是当我取消对 SET 语句的注释并执行时,它会尝试运行 SET 语句,并且由于表不存在而自然给出错误。

DECLARE @zeus_calls310_counter int;

IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310')
BEGIN
    --SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[dbo].[calls_310]);
    PRINT 'TRUE'
END
ELSE 
BEGIN
    PRINT 'FALSE';
END
4

4 回答 4

5

您的标题表明您的理解出错了。在表不存在的情况下,并不是SET语句运行报错;就是在解析语句时出现错误。

每当您运行某些 SQL 时,服务器首先解析该语句,然后,如果解析成功,则运行它。因此,您不能拥有依赖于表存在的裸 SQL!无论表是否存在,您的SET语句都将被解析- 所以当它不存在时,解析失败。

对此的一种解决方案是包装那些依赖于对象的语句,这些对象可能存在也可能不存在于EXEC. 但是,在这种情况下,您希望使用对该表的查询结果填充变量,并且EXEC该变量内部将不在范围内。所以我们需要更多关于你正在做什么的细节@zeus_calls310_counter——如果它很快就会被使用,也许你可以把整个事情,包括它的声明,包装在一个EXEC.

于 2013-02-12T09:33:41.563 回答
2

@AAkashM 是在正确的轨道上。

如果您使用EXEC sp_executesql,您还可以指定 OUTPUT 参数,在您的情况下,该参数将包含SELECT COUNT语句的结果。

于 2013-02-12T12:20:10.210 回答
-1

尝试这个 :

DECLARE @zeus_calls310_counter int;

IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310')
BEGIN
    SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[calls_310]);
    PRINT 'TRUE'
END
ELSE 
BEGIN
    PRINT 'FALSE';
END
于 2013-02-12T09:16:29.253 回答
-1

使用它来检查表是否存在

IF OBJECT_ID(N'[zeus].[table_name]', N'U') IS NULL
BEGIN
    --
END
ELSE
BEGIN
    --
END
于 2013-02-12T09:22:05.753 回答