来自OBJECT_ID的SELECT NULL和NULL对于exists的看法不同

时间:2015-02-04 17:22:30

标签: sql-server tsql

我想知道为什么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

2 个答案:

答案 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。因此,值确实存在且该子句有效。