如何更改表添加列然后在单个脚本中更新?

时间:2013-06-12 05:45:28

标签: sql sql-server alter

我们有一个自定义数据库更新程序,它在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满意之外,没有任何理由将脚本数量加倍。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

您可以使用EXEC在子批处理中运行它。

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

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

注意:查询中的所有单引号都需要加倍,如上所述,以便在字符串文字中对其进行转义。

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

alter table then update in single statement

答案 1 :(得分:0)

我们的解决方案是撒上" GO"整个脚本中的命令,并自定义我们的脚本执行功能,将它们分开并单独运行。

这模仿了SQL管理工作室的功能,并且似乎有效。

答案 2 :(得分:0)

关于从EF迁移创建SQL脚本我遇到同样的问题(update-database -script -sourcemigration 0)

生成的一些sql:

IF @CurrentMigration < '201504141848410_AddFirstTwoComponentsOfClientEX'
BEGIN
    ALTER TABLE [dbo].[ClientData] ADD [ExFirstName] NVARCHAR(2) 

    UPDATE [ClientData]
                        SET ExFirstName = LEFT(EX,2)
                      WHERE RandomEX = 0
                        AND LEN(EX) = 8

鉴于我已经在生成的sql脚本中进行了一百次迁移,我正在寻找一种方法来完成此操作,而不会将当前的迁移分解为多个部分。