我有一个需要添加列的部署脚本,然后用一些数据填充它。我检查列是否存在 - 如果它没有添加它,并尝试更改该值。
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND name = 'MyColumn')
BEGIN
ALTER TABLE [dbo].MyTable
ADD MyColumn INT NULL
...
UPDATE MyTable SET MyColumn = MyValue
END
然而,脚本失败(在预编译?),因为它说MyColumn不存在。
我能想到解决这个问题的唯一方法是将UPDATE语句更改为动态SQL,并以这种方式执行EXEC。
有更好的方法吗?
答案 0 :(得分:1)
由于编译,这很棘手。一种解决方案是动态SQL:
exec sp_executesql 'UPDATE MyTable SET MyColumn = MyValue';
如果采用此路径,则应将值作为参数传递。
答案 1 :(得分:0)
您应该将更新声明置于 IF NOT EXISTS 条件的一侧。
原因:如果您的表中已经存在列,则它将退出该条件并执行update语句,否则它将添加该列,然后执行更新。看看下面的代码:
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id =
OBJECT_ID(N'[dbo].[MyTable]') AND name = 'MyColumn')
BEGIN
ALTER TABLE [dbo].MyTable
ADD MyColumn INT NULL
END
GO
UPDATE MyTable SET MyColumn = 1
GO