Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译一个SQL Server脚本,其中包含一个不包含';不存在?_Sql_Sql Server - Fatal编程技术网

编译一个SQL Server脚本,其中包含一个不包含';不存在?

编译一个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

我有一个SQL脚本,在删除列之前在数据库上作为迁移运行。因为源列存在,所以它第一次工作正常,但是如果您再次尝试运行迁移,它将失败,因为现在该列不存在。我将它包装在IF中,因此该语句仅在列确实存在时运行,但它仍然需要能够编译该位,即使我知道它不会运行它

以下是一个简化版本:

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;