3

我已经搜索并没有发现任何关于它的信息(我相信这是不可能的)。我的问题是我必须检查是否存在临时表以及该临时表上是否有一些特定数据。

以前有人遇到过吗?你是如何设法解决的?我想避免创建数百万个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 不存在(可能发生)时,问题就来了。它会抛出一个错误,因为虽然第一个语句返回 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

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

4

5 回答 5

3

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

它不会评估语句的第一部分,然后仅当这是真的时才编译第二部分。您需要将存在的测试和引用表的查询拆分为两个单独的语句,以便分别编译它们。

于 2012-09-20T11:47:20.407 回答
2

这里

没有 XAND 逻辑门(异与)之类的东西。从理论上讲,XAND 意味着两个操作数都为真或都为假。所以这意味着 XAND 与等于 (=) 相同,至少对于按位逻辑运算而言。

请显示一些示例代码来说明您要执行的操作。

问候

于 2012-09-20T09:25:02.790 回答
2

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

于 2012-09-20T11:29:32.800 回答
1

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

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 值。这意味着你可以做一些很酷的事情,比如在运行一个昂贵的大型查询之前运行一系列小查询来检查一些值。让我知道这是否真的是非法的!它在我的机器上工作:)

于 2014-07-10T23:42:44.533 回答
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 将表名和可能的过滤器值输入到此 UDF。在这种情况下,您可以在 IF 中使用此 UDF。

于 2012-09-20T12:34:56.960 回答