SELECT OBJECT_ID 中的 NULL 和 NULL 对 exists 的看法不同

SELECT NULL and NULL from OBJECT_ID seen differently for exists

我想知道为什么 EXISTS 在从 OBJECT_ID() 返回时表现得好像 NULL 是结果集,但在 运行 SELECT NULL[=14= 时却不是]

我暂时忘记了通过 OBJECT_ID 检查 table 是否存在的常用语法,所以我想出了类似的东西:

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('clearlynotpresent') 您将在 SSMS 中得到相同的结果集,但它们的行为不同在此上下文中使用 EXISTS。

我现在找到了我想要的正确语法: 如果 (SELECT OBJECT_ID('clearlynotpresent')) 不为空

您使用的 SQL 服务器是什么版本?您的两个示例都为我返回了 exists 语句(2012 年)。

至于为什么会这样,SELECT声明了returns一个值,但是这个值恰好是null。因此,一个值确实存在并且该子句有效。

在 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'

(table "Pages" 存在,"xyz" 不存在)并得到以下结果:

Table Pages exists
Table xyz exists
Null exists

这对我来说很有意义,因为 exists 检查指定子集中是否存在 any 数据(即行)(括弧)。在这三种情况下,只有一行数据;它是包含 NULL 整数的单个列这一事实无关紧要。

情况可能会因您使用的 SQL 版本而异,但这似乎不太可能。

根据@JamesZ 的评论,您最好使用

IF object_id('xyz') is [not] null