如果所有表中不存在某列,是否添加该列?
我正在使用 SQL Server 2005/2008。如果表尚不存在,我需要将其添加到表中。这将适用于给定数据库中的所有表。我希望我已经接近了,但我对这个解决方案有疑问。
这怎么能做到呢?
这就是我所拥有的:
EXEC sp_MSforeachtable '
declare @tblname varchar(255);
SET @tblname = PARSENAME("?",1);
if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = @tblname and column_name = ''CreatedOn'')
begin
ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end
'
但我收到错误:
错误 102:“@tblname”附近的语法不正确。 “CreatedOn”附近的语法不正确。 “@tblname”附近的语法不正确。 “CreatedOn”附近的语法不正确。 ...对于每个表,依此类推。
I'm using SQL Server 2005/2008. I need to add a column to a table if it does not yet exist. This will apply to all tables in a given database. I hoped I was close, but I'm having issues with this solution.
How can this be done?
Here's what I have:
EXEC sp_MSforeachtable '
declare @tblname varchar(255);
SET @tblname = PARSENAME("?",1);
if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = @tblname and column_name = ''CreatedOn'')
begin
ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end
'
But I get errors:
Error 102: Incorrect syntax near '@tblname'.
Incorrect syntax near 'CreatedOn'.
Incorrect syntax near '@tblname'.
Incorrect syntax near 'CreatedOn'.
... and so on, for each table.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您不能在 DDL 中使用变量,例如 @tableName。此外,将名称分成几部分并忽略架构只会导致错误。您应该只在 SQL 批处理参数中使用 ''?'' 替换,并依赖
MSforeachtable
替换:You cannot use variables, like @tableName, in DDL. Besides, splinting the name into part and ignoring the schema can only result in bugs. You should just use the ''?'' replacement in the SQL batch parameter and rely on the
MSforeachtable
replacement:您需要混合一些动态 SQL。这应该有效:
You'll need to mix in a bit of dynamic SQL. This should work:
也许像这样:
?
或者甚至像这样:
Maybe like this:
?
Or even like this: