我正在尝试编写一个更新列的DML脚本,但我想确保列首先存在,所以我将它包装在IF EXISTS块中
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled')
BEGIN
UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21
END
所以奇怪的是,即使条件失败,它也会尝试执行更新。所以列不存在,UPDATE语句运行,我得到一个错误。为什么呢?
更奇怪的是,这确实有效:
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled')
BEGIN
EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21')
END
UPDATE命令是否有一些特殊之处导致它以这种方式运行?
答案 0 :(得分:6)
问题是脚本将被编译/解析,如果列不存在,则会出现编译/解析错误。
列名无效 'IsClarityEnabled'。
答案 1 :(得分:2)
你确定吗?我怀疑实际发生的是SQL Server正在尝试解析即使条件
失败,它也会尝试执行更新
UPDATE
,无论条件的值如何。由于解析在执行之前发生,因此在解析时SQL Server无法“知道”您已通过检查保护此UPDATE
- 解析器只知道IsClarityEnabled
列上没有Client
列1}},所以它抱怨。
EXEC
正常工作的原因很简单,因为解析器不会处理字符串文字。这是使脚本必须针对在执行时才知道的模式运行的标准方法。