我使用生成的SQL脚本(sql 2k5)将列添加到表中。
我需要添加“检查是否存在”,因为我的客户有时会运行脚本两次。 (我无法控制这部分,这种情况一次又一次地发生)
我找到了加入sysobjects和syscolumns的方法,它可以工作。
我的问题是我必须在另一个表中添加一列,其中列不在表的末尾。
对于这个,SQL正在生成那个长代码...使用新列创建新的临时表,从旧表中填充,删除旧表,最后重命名临时表。
这里的问题是这个脚本的脚本中有很多GO和事务......
我该怎么办?
1。)删除所有GO - s? (不喜欢这个想法)
2。)在每个GO对之间添加我的IF? (不喜欢这个想法)
3。)是否有另一种有意义的方式,实施
并不难我无法想到任何事情,我可以检查发布版本,或者任何东西,而不仅仅是我的sysobjects和syscolumns join,但问题将是相同的。
因为GO-s,当它到达BEGIN的END时,我的If会被“遗忘”......
答案 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/