2011-05-03 29 views
0

我想执行以下代码在一个事务中迁移的一部分,但除非我把GO声明ADD CONSTRAINT语句后的代码失败:如何添加列的默认值并在SQL Server中使用默认值在单个批处理中更新所有行?

ALTER TABLE T ADD C INT NULL 
ALTER TABLE T ADD CONSTRAINT DF_T_C DEFAULT ((1)) FOR C 
GO 
UPDATE T SET C = DEFAULT 
ALTER TABLE T ALTER COLUMN C INT NOT NULL 

如果我离开了GO声明,我得到以下错误:

Invalid column name 'C'.

执行迁移不能处理GO语句的代码,我怎么能得到这个在单个事务工作?

回答

3

您可以使用EXEC作为有问题的语句,以便它们被编译为不同的批处理。

EXEC('UPDATE T SET C = DEFAULT; 
     ALTER TABLE T ALTER COLUMN C INT NOT NULL') 

但你也可以做

ALTER TABLE T ADD C INT NOT NULL CONSTRAINT DF_T_C DEFAULT ((1)) 

,而不是做所有自己这些各个步骤。

+0

@michielvoo - 声明不仅关闭它是完全正确的! 'CREATE TABLE #T(B INT NULL); INSERT INTO #T VALUES(10); ALTER TABLE #T ADD C INT NOT NULL CONSTRAINT DF_T_C DEFAULT((1)); SELECT * FROM #T; DROP TABLE#T' – 2011-05-18 17:43:12

0
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

SET XACT_ABORT ON; 

BEGIN TRANSACTION; 

ALTER TABLE T ADD C INT NULL; 

ALTER TABLE T ADD CONSTRAINT DF_T_C DEFAULT ((1)) FOR C; 
EXEC ('UPDATE T SET C = DEFAULT'); 

ALTER TABLE T ALTER COLUMN C INT NOT NULL; 

COMMIT TRANSACTION; 
-2

我结束了这一点,这一切都不会在一个声明:

ALTER TABLE T ADD C INT NOT NULL CONSTRAINT DF_T_C DEFAULT ((1)) WITH VALUES 

工程与SQL Server。

+0

只有当列是'NULL'时,'WITH VALUES'才需要,然后看起来你的脚本事后将它设置为'NOT NULL'。我的答案中的陈述在一个陈述中完成,并且避免了需要这样做。 – 2011-05-06 12:22:29

+0

@Martin对不起,它应该不是NULL,我纠正了我的答案。 – 2011-05-18 17:16:35

+0

然后按照我的答案显示,您不需要'WITH VALUES'。 – 2011-05-18 17:37:21