我们有一个自定义数据库更新程序,它在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满意之外,没有任何理由将脚本数量加倍。
我该如何解决这个问题?
答案 0 :(得分:1)
您无法在单个语句(或批处理)中执行完全,并且您使用的工具似乎不支持GO
作为批处理分隔符。
您可以使用EXEC
在子批处理中运行它。
ALTER TABLE A
ADD c1 INT, c2 VARCHAR(10);
EXEC('
UPDATE A
SET c1 = 23,
c2 = ''ZZXX'';
');
注意:查询中的所有单引号都需要加倍,如上所述,以便在字符串文字中对其进行转义。
我尝试了这种方法,这是有效的。
答案 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脚本中进行了一百次迁移,我正在寻找一种方法来完成此操作,而不会将当前的迁移分解为多个部分。