如果列不存在alter table

时间:2011-05-02 12:39:48

标签: sql-server-2005 transactions if-statement

我使用生成的SQL脚本(sql 2k5)将列添加到表中。

我需要添加“检查是否存在”,因为我的客户有时会运行脚本两次。 (我无法控制这部分,这种情况一次又一次地发生)

我找到了加入sysobjects和syscolumns的方法,它可以工作。

我的问题是我必须在另一个表中添加一列,其中列不在表的末尾。

对于这个,SQL正在生成那个长代码...使用新列创建新的临时表,从旧表中填充,删除旧表,最后重命名临时表。

这里的问题是这个脚本的脚本中有很多GO和事务......

我该怎么办?

1。)删除所有GO - s? (不喜欢这个想法)

2。)在每个GO对之间添加我的IF? (不喜欢这个想法)

3。)是否有另一种有意义的方式,实施

并不难

我无法想到任何事情,我可以检查发布版本,或者任何东西,而不仅仅是我的sysobjects和syscolumns join,但问题将是相同的。

因为GO-s,当它到达BEGIN的END时,我的If会被“遗忘”......

2 个答案:

答案 0 :(得分:7)

我不确定我是否遵循了您的全部问题,但您会检查是否存在这样的列:

if not exists (select * from information_schema.columns 
               where table_name = '[the tables name]' 
               and column_name = '[column name')
begin
 --alter table here
end

为什么要担心色谱柱的序号位置?新列获得一个新的colid并附加到“end”,这不应该导致任何问题。

如果您通过发送这些类型的脚本进行频繁更新,我会创建一个版本表,并在脚本的开头查询它。

答案 1 :(得分:0)

他们如何运行脚本(因为您使用的是支持GO批处理分隔符的工具) - SQL CMD?

我会考虑将它全部放在字符串中并使用EXEC。几个DDL命令必须是批处理中的第一个命令。此外,您有时会遇到解析问题:

ALTER TABLE Executing regardless of Condition Evaluational Results

此外,您可能希望查看SQLCMD的控件功能http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/