开发者

UPDATE statement wrapped in an IF EXISTS block

I'm trying to write a DML script that updates a column but I wanted to make sure the column existed first so I wrapped it in a IF EXISTS block

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

So the weirdness is that it tries to execute the update even if it fa开发者_运维问答ils the condition. So column doesn't exist and the UPDATE statement runs and I get an error. Why?

Even stranger is that this does work:

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

Is there something special about an UPDATE command that causes it to behave this way?


The problem is that the script will be compiled/parsed, and if the column does not exist, you will have a compile/parse error.

Invalid column name 'IsClarityEnabled'.


it tries to execute the update even if it fails the condition

Are you sure? I suspect that what is actually happening is that SQL Server is attempting to parse the UPDATE, whatever the value of the condition. Since parsing happens before execution, at parse time SQL Server can't 'know' that you have protected this UPDATE with a check - the parser only knows that there isn't an IsClarityEnabled column on Client, and so it complains.

The reason the EXEC works as you want is preciely because the string literal isn't processed by the parser. This is the standard way of having scripts that must run against a schema that isn't known until execution time.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜