IF条款中的短路

时间:2012-09-20 09:16:31

标签: sql-server sql-server-2008 bitwise-operators temp-tables

我已经搜索过并且一无所获(我相信这是不可能的)。我的问题是我必须检查是否存在临时表,以及该临时表上是否有某些特定数据。

之前有人遇到过这种情况吗?你是怎么设法解决的?我想避免创建数百万个IF..ELSE块。

编辑:

IF (OBJECT_ID('tempdb..#tempTable') IS NOT NULL 
AND EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value'))
BEGIN
   PRINT 'Temp table and data exists'
END
ELSE
BEGIN
   PRINT 'Temp table or data does not exist'
END

这就是我想要做的。当tempTable不存在(可能发生)时,就会出现问题。它会抛出一个错误,因为虽然第一个stamement返回false,但它会继续执行第二个语句。并且SELECT语句无法找到表,因此会抛出错误。我找到的解决方案就是这样做:

IF OBJECT_ID('#tempTable') IS NOT NULL
BEGIN
    IF EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value'
    BEGIN
        PRINT 'Temp table and data exists'
    END
    ELSE
    BEGIN
        PRINT 'Temp table exists but data does not exist'
    END
END
ELSE
BEGIN
    PRINT 'Temp table does not exist'
END

我的问题是,有没有一种方法可以有两个条件,如果第一个条件返回false则不检查第二个条件?在编程语言中使用&&的方式。

5 个答案:

答案 0 :(得分:3)

您尝试做的事情是不可能的,因为这是编译时失败,整个语句需要一起编译。

它不会评估语句的第一部分,只有在真实时才编译第二部分。您需要将存在的测试和引用该表​​的查询拆分为两个单独的语句,以便它们单独编译。

答案 1 :(得分:2)

请参阅here

没有XAND逻辑门(独占AND)这样的东西。从理论上讲,XAND意味着两个操作数都是真的,或者两者都是假的。所以这意味着XAND与Equals(=)相同,至少对于按位逻辑运算。

请显示一些示例代码,以说明您要做的事情。

此致

答案 2 :(得分:2)

前段时间我已经搜索了这个问题,如果我没记错的话,Sql Server确实会短路逻辑条件,但不管它们出现在if子句中的顺序如何,它决定首先检查哪一个

答案 3 :(得分:1)

这可能是一个粗略的解决方案,但我有时会使用COALESCE语句来控制if,else,然后是你试图获得的结构。在这种情况下,它看起来有点脏,因为我们正在寻找合并语句的逆。

DECLARE @temp_message AS varchar(100)
SELECT @temp_message = COALESCE(CASE
                                 WHEN OBJECT_ID('tempdb..#tempTable') IS NOT NULL THEN NULL
                                 ELSE 'Temp table does not exist'
                                END,
                                CASE
                                 WHEN EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value') THEN NULL
                                 ELSE 'Specified value does not exist in temp table'
                                END,
                                'Temp table and data exists')

PRINT @temp_message

COALESCE一个接一个地运行一个语句,直到一个语句没有产生NULL值。这意味着您可以执行很酷的操作,例如在运行大量昂贵的查询之前运行一系列小查询来检查某些值。如果这真的是非法的,请告诉我!它适用于我的机器:)

答案 4 :(得分:0)

我在MSSQL中看到了两种接近它的方法:

首先。如果您使用sp_executesql(动态sql),您的存储过程将被编译而不会出错。此外,如果#tempTable不存在,服务器将输出错误但继续批处理执行:

exec sp_executesql N'SELECT count(*) FROM #tempTable WHERE THIS_COLUMN = ''value'''
if @@rowcount > 0 
     print 'ok'
else 
     print 'error'
end;

第二。只需使用嵌套的IF和EXISTS创建用户定义的函数(正如您现在所做的那样)输出0和1.并使用动态sql输入表名和可能的过滤值(s)到这个UDF。在这种情况下,您可以在IF中使用此UDF。