需要执行可重新运行的t-sql脚本来创建列(如果不存在),然后执行一些操作
我正在使用SQLServer2005 其思想是创建一个列,将值更新为0,使其不可为null,然后重新创建一个现有PK,将其添加到列表中 到目前为止,我得到了这个:需要执行可重新运行的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
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,