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

时间:2010-11-23 14:48:09

标签: sql sql-server sql-server-2005

我正在使用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”语句就像启动一个全新的脚本,而变量的值就丢失了 任何想法??

1 个答案:

答案 0 :(得分:2)

选项1

而不是GO,请尝试包含TRANSACTION的{​​{1}};然后提交它,看看你是否可以ADD COLUMN

选项2

尝试UPDATE时设置默认值约束,这样您就不必ADD COLUMNUPDATE不允许ALTER