无论IF ELSE条件如何,SET语句始终运行

时间:2013-02-12 09:14:22

标签: sql sql-server set if-statement

我在这个SQL代码上失去了理智。使用简单的PRINT语句进行测试时,下面的IF ELSE语句正常运行,即表不存在,因此它打印'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 个答案:

答案 0 :(得分:5)

您的标题表明您的理解出错的地方。如果表不存在,则SET语句不会运行并发出错误;当语句解析时,就会出现错误。

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

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

答案 1 :(得分:2)

@AAkashM走在正确的轨道上。

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

答案 2 :(得分:-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

答案 3 :(得分:-1)

用它来检查表是否存在

IF OBJECT_ID(N'[zeus].[table_name]', N'U') IS NULL
BEGIN
    --
END
ELSE
BEGIN
    --
END