我有一个要在查询后运行的表
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
这是因为SQL Server解析并验证该语句,而不考虑IF
语句,这意味着它解析并验证了整个批处理。因此,在解析语句时:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句