我想知道为什么EXISTS的行为就像从OBJECT_ID()返回时NULL是一个结果集,但是当你运行SELECT NULL时却没有
我简单地忘记了通过OBJECT_ID检查表是否存在的通常语法,所以我想出了类似的东西:
IF EXISTS (SELECT OBJECT_ID('clearlynotpresent'))
BEGIN
PRINT 'Table exists'
EXEC sp_rename @objname = 'clearlynotpresent', @newname = 'clearlypresent'
END
ELSE
PRINT 'No table present'
这不像我想象的那样有效。所以我把它比作:
IF EXISTS (SELECT NULL)
PRINT 'Null exists'
ELSE
PRINT 'No null'
如果手动运行SELECT NULL和SELECT OBJECT_ID('clearnotpresent'),您将在SSMS中获得相同的结果集,但它们在此上下文中的行为与EXISTS不同。
我现在找到了正确的语法: IF(SELECT OBJECT_ID('clearnotpresent'))IS NOT NULL
答案 0 :(得分:2)
在SQL 2008中,我运行了以下内容:
IF EXISTS (SELECT OBJECT_ID('Pages'))
PRINT 'Table Pages exists'
ELSE
PRINT 'No table present'
IF EXISTS (SELECT OBJECT_ID('xyz'))
PRINT 'Table xyz exists'
ELSE
PRINT 'No table present'
IF EXISTS (SELECT NULL)
PRINT 'Null exists'
ELSE
PRINT 'No null'
(表"页面"存在," xyz"不存在)并得到以下结果:
Table Pages exists
Table xyz exists
Null exists
这对我来说很有意义,因为exists
检查是否有任何数据 - 即行 - 存在于指定的子集中(括号中的内容是什么) )。在所有三种情况下都有一行数据;事实上它是一个包含NULL整数的单列是无关紧要的。
根据您使用的SQL版本,情况可能会有所不同,但这似乎不太可能。
根据@JamesZ的评论,您最好使用
IF object_id('xyz') is [not] null
答案 1 :(得分:1)
您使用的是哪个版本的SQL Server?你的两个例子都给我发了一个exists语句(2012年)。
至于为什么会发生这种情况,SELECT语句返回一个值,但该值恰好为null。因此,值确实存在且该子句有效。