编译一个SQL Server脚本,其中包含一个不包含';不存在?
我有一个SQL脚本,在删除列之前在数据库上作为迁移运行。因为源列存在,所以它第一次工作正常,但是如果您再次尝试运行迁移,它将失败,因为现在该列不存在。我将它包装在IF中,因此该语句仅在列确实存在时运行,但它仍然需要能够编译该位,即使我知道它不会运行它 以下是一个简化版本:编译一个SQL Server脚本,其中包含一个不包含';不存在?,sql,sql-server,Sql,Sql Server,我有一个SQL脚本,在删除列之前在数据库上作为迁移运行。因为源列存在,所以它第一次工作正常,但是如果您再次尝试运行迁移,它将失败,因为现在该列不存在。我将它包装在IF中,因此该语句仅在列确实存在时运行,但它仍然需要能够编译该位,即使我知道它不会运行它 以下是一个简化版本: IF COL_LENGTH('TableA', 'SourceColumn') IS NOT NULL BEGIN UPDATE TableB SET DestColumn = TableA.SourceCol
IF COL_LENGTH('TableA', 'SourceColumn') IS NOT NULL
BEGIN
UPDATE TableB
SET DestColumn = TableA.SourceColumn
FROM TableB
JOIN TableA AS ON TableB.AId = TableA.Id
WHERE TableB.DestColumn != TableA.SourceColumn;
END
ALTER TABLE TableA
DROP COLUMN SourceColumn;
一种方法是动态SQL:
IF COL_LENGTH('TableA', 'SourceColumn') IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = '
UPDATE TableB
SET DestColumn = TableA.SourceColumn
FROM TableB JOIN
TableA
ON TableB.AId = TableA.Id
WHERE TableB.DestColumn <> TableA.SourceColumn';
EXEC sp_executesql @sql;
END;
这是怎么回事?它使用范围规则来分配子查询中SourceColumn
的值。如果该列位于表A
中,则填写该列。如果不是,则用v
中的值填充。但是,这并不重要,因为在这种情况下不会运行代码。唯一的目的是避免标识符错误。exec('updatetableb……WHERE TableB.DestColumn!=TableA.SourceColumn;')代码>
IF COL_LENGTH('TableA', 'SourceColumn') IS NOT NULL
BEGIN
UPDATE TableB
SET DestColumn = a.SourceColumn
FROM TableB JOIN
(SELECT a.id,
(SELECT SourceColumn -- NO ALIAS!!
FROM TableA a2
WHERE a2.id = a.id
) as SourceColumn
FROM TableA a CROSS JOIN
(VALUES (NULL)) v(SourceColumn)
) a
ON TableB.AId = a.Id
WHERE TableB.DestColumn <> TableA.SourceColumn;
END;