Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
需要执行可重新运行的t-sql脚本来创建列(如果不存在),然后执行一些操作_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

需要执行可重新运行的t-sql脚本来创建列(如果不存在),然后执行一些操作

需要执行可重新运行的t-sql脚本来创建列(如果不存在),然后执行一些操作,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在使用SQLServer2005 其思想是创建一个列,将值更新为0,使其不可为null,然后重新创建一个现有PK,将其添加到列表中 到目前为止,我得到了这个: IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'Division') BEGIN ALTER TABLE MyTable ADD Division int NULL

我正在使用SQLServer2005

其思想是创建一个列,将值更新为0,使其不可为null,然后重新创建一个现有PK,将其添加到列表中 到目前为止,我得到了这个:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'Division')
BEGIN
   ALTER TABLE MyTable ADD Division int NULL
   UPDATE MyTable SET Division = 0
   ALTER TABLE MyTable ALTER COLUMN Division int NOT NULL

   ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [PK_MyTable]

    ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC,
        [OfferCode] ASC,
        [StationCode] ASC,
        [Market] ASC,
        [Division] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]   

END
问题是我需要一个“GO”语句以便创建新列,否则在尝试将值更新为0时会出错。如果我放入一个“GO”语句,那么If子句就不起作用(因为该列现在已经存在)。我曾考虑将该状态设置为@ColumnWasCreated这样的变量,但“GO”语句就像启动一个全新的脚本,变量的值丢失了
有什么想法吗

尝试一个包含
添加列的
事务,而不是
执行
;然后提交它并查看是否可以
更新

选项2


添加列
时尝试设置默认值约束,这样,您就不必
更新
更改
以不允许
为空

选项2工作得很好(并且无需创建事务)。ALTER TABLE MyTable ADD Division int NOT NULL默认值0谢谢!哎呀,刚刚意识到。我不想要列的默认值。有没有一种方法可以在事后轻松地将其移除?(这是一个约束)是的,您应该能够
更改表放置约束
;这里有一个问题:如果使用
TABLE create
命令创建约束,则需要自动生成的约束名称。因此,您需要一个查询来从
sys
数据表中提取约束。@Daniel,