我试图用谷歌搜索,但找不到方法
我有一个t-sql脚本,该脚本将新列添加到表中,然后根据该表中其他列的值填充该列,最后删除一些列。这一切都很好。
当我想再次运行脚本时,会出现问题。我有一个if子句,用于检查缺少的列是否存在,但是即使if子句中的代码未运行,SSMS仍会抱怨并显示错误消息。该脚本必须能够再运行一次,并且我不希望显示错误消息!
在代码中(显然是测试代码,不想在此处转储生产代码…):
create table test ( Name text, Switch int, ValueA int, ValueB int) go insert into test values ('Name', 0, 5, 10) if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test') begin alter table test add ValueC int end go -- This batch rasies error when run more then once! if exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test') begin update test set ValueC = (select case Switch when 0 then (select (ValueA - ValueB)) when 1 then (select (ValueB - ValueA)) end) end go if exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test') begin alter table test drop column ValueA end go select * from test --Name 0 10 -5
这是错误消息:
Msg 207, Level 16, State 1, Line 6 Invalid column name 'ValueA'. Msg 207, Level 16, State 1, Line 7 Invalid column name 'ValueA'.
干杯-乔克
是的,没有动态SQL是可能的,但是有一些麻烦的解决方法。我只会用EXEC这个。
EXEC
此处说明了SQL 2000中的行为
Erland Sommarskog提到“一旦查询中的所有表都存在,SQL Server会对查询执行完全检查。”
因此,通过在查询中向不存在的表添加无操作引用,可以推迟编译。通过此调整,下面的脚本可以多次运行而不会出现错误。
insert into test values ('Name', 0, 5, 10) if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test') begin alter table test add ValueC int end go create table #dummy (i int) -- This batch raised error when run more then once! if exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test') begin update test set ValueC = (select case Switch when 0 then (select (ValueA - ValueB)) when 1 then (select (ValueB - ValueA)) end) where not exists(select * from #dummy) end drop table #dummy go if exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test') begin alter table test drop column ValueA end go select * from test --Name 0 10 -5