如果语句在sql server查询中无法正常工作

时间:2015-02-05 05:44:34

标签: sql sql-server

我有一个表格,我想在查询后运行

IF COL_LENGTH('table_name','IsDeleted') IS NOT NULL
BEGIN
    IF COL_LENGTH('table_name','IsActive') IS NOT NULL
    BEGIN
        UPDATE table_name 
        SET IsActive = ~IsDeleted
    END
    ELSE
    BEGIN
        EXEC sp_RENAME 'table_name.IsDeleted', 'IsActive', 'COLUMN'

        UPDATE table_name
        SET IsActive = ~IsActive
    END

    ALTER TABLE table_name
    DROP CONSTRAINT DF_table_name_IsDeleted
    ALTER TABLE table_name DROP COLUMN IsDeleted
END
ELSE
BEGIN
     --IsDeleted column does not exist
END

在我的表中没有名称为“IsDeleted”的列,因此它不应该输入第一个if语句。但不知何故,它进入第一个if语句给我错误信息:

  

无效的列名称'IsDeleted'。“

在行SET IsActive = ~IsDeleted

我的查询有什么问题?为什么控制不会进入其他部分。有没有语法错误?

IsActive和IsDeleted属于BIT类型

1 个答案:

答案 0 :(得分:2)

这是因为无论IF语句如何,SQL Server都会解析并验证语句,这意味着它会解析并验证整个批处理。所以在解析语句时:

UPDATE table_name SET  IsActive = ~IsDeleted

它错误地说:

  

列名IsDeleted无效

见这个例子:

IF 1 = 1 BEGIN
    CREATE TABLE #temp(col INT)
END
ELSE BEGIN
    CREATE TABLE #temp(col INT)
END

产生错误:

  

已经有一个名为'#temp'在数据库中。

解决方法是使用Dynamic SQL

DECLARE @sql NVARCHAR(MAX)
IF COL_LENGTH('table_name','IsDeleted') IS NOT NULL BEGIN

    IF COL_LENGTH('table_name','IsActive') IS NOT NULL BEGIN
        SET @sql = 'UPDATE table_name SET IsActive = ~IsDeleted'
        EXEC sp_executesql @sql
    END
    ELSE BEGIN
        EXEC sp_RENAME 'table_name.IsDeleted', 'IsActive', 'COLUMN'
        SET @sql = 'UPDATE table_name SET IsActive = ~IsActive'     
        EXEC sp_executesql @sql
    END
    ....
END