UPDATE语句包含在IF EXISTS块中

时间:2010-04-06 17:03:31

标签: sql sql-server tsql

我正在尝试编写一个更新列的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命令是否有一些特殊之处导致它以这种方式运行?

2 个答案:

答案 0 :(得分:6)

问题是脚本将被编译/解析,如果列不存在,则会出现编译/解析错误。

  

列名无效   'IsClarityEnabled'。

答案 1 :(得分:2)

  

即使条件

失败,它也会尝试执行更新
你确定吗?我怀疑实际发生的是SQL Server正在尝试解析 UPDATE,无论条件的值如何。由于解析在执行之前发生,因此在解析时SQL Server无法“知道”您已通过检查保护此UPDATE - 解析器只知道IsClarityEnabled列上没有Client列1}},所以它抱怨。

EXEC正常工作的原因很简单,因为解析器不会处理字符串文字。这是使脚本必须针对在执行时才知道的模式运行的标准方法。