我正在使用sql server 2005
这个想法是创建一个列,将值更新为0,然后使其不可为空,并重新创建一个现有的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”语句就像启动一个全新的脚本,而变量的值就丢失了 任何想法??
答案 0 :(得分:2)
选项1
而不是GO
,请尝试包含TRANSACTION
的{{1}};然后提交它,看看你是否可以ADD COLUMN
。
选项2
尝试UPDATE
时设置默认值约束,这样您就不必ADD COLUMN
或UPDATE
不允许ALTER
。