我有一个表格,我想在查询后运行
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类型
答案 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