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