2

我们有一个自定义数据库更新程序,它在 SQL Server 上运行各种 SQL 脚本。一些脚本需要向表中添加一个新列,然后在单个脚本中的事务中填充值:

using (var scope = new TransactionScope()) {

    ... alter table MyTable add FOOBAR int;
    ... update schappointment set FOOBAR = 1;

}

问题是,SQL 吐回“无效的列名'FOOBAR',因为“alter table”命令尚未生效。将其包装起来exec()没有区别:

    ... exec('alter table MyTable add FOOBAR int;')
    ... update schappointment set FOOBAR = 1;

它在 SQL Management Studio 中运行良好,因为它使用 GO 命令(我知道这不是有效的 T-SQL 命令)将其拆分。

我不想在项目中创建任何新的依赖项。

我的偏好是不要拆分模式和数据脚本,因为这会使脚本数量翻倍,除了让 SQL 满意之外,没有其他原因。

我该如何解决这个问题?

4

2 回答 2

3

您不能在单个语句(或批处理)中完全执行此操作,而且您使用的工具似乎不支持GO作为批处理分隔符。

不过,您可以使用EXEC它在子批次中运行它。

ALTER TABLE A
  ADD c1 INT, c2 VARCHAR(10);

EXEC('
UPDATE A
SET    c1 = 23,
       c2 = ''ZZXX'';
    ');

注意:查询中的所有单引号都需要像上面那样加倍以在字符串文字中转义它们。

我尝试了这种方法,这是有效的。

更改表然后在单个语句中更新

于 2016-05-31T07:36:40.223 回答
0

我们的解决方案是在整个脚本中添加“GO”命令,并自定义我们的脚本执行功能以将它们拆分并单独运行。

这模仿了 SQL 管理工作室所做的并且似乎有效。

于 2014-09-03T10:44:39.767 回答