这是因为SQL Server解析并验证该语句,而不考虑该
IF语句,这意味着它解析并验证了整个批处理。因此,在解析语句时:
UPDATE table_name SET IsActive = ~IsDeleted
它错误地说:
无效的列名IsDeleted
请参阅以下示例:
IF 1 = 1 BEGIN CREATE TABLE #temp(col INT)ENDELSE 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


