添加一列,如果它不存在所有表?
我正在使用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'附近语法不正确。 ...等等,每个表。
你不能在DDL中使用变量,比如@tableName。 此外,将名称拼凑成部分并忽略模式只会导致错误。 您应该只使用SQL批处理参数中的''''替换,并依靠MSforeachtable
替换:
EXEC sp_MSforeachtable '
if not exists (select * from sys.columns
where object_id = object_id(''?'')
and name = ''CreatedOn'')
begin
ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end';
你需要混合一些动态SQL。 这应该工作:
EXEC sp_MSforeachtable '
declare @tblname varchar(255);
SET @tblname = PARSENAME("?",1);
declare @sql nvarchar(1000);
if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = @tblname and column_name = ''CreatedOn'')
begin
set @sql = N''ALTER TABLE '' + @tblname + N'' ADD CreatedOn datetime NOT NULL DEFAULT getdate();''
exec sp_executesql @sql
end
'
也许这样:
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 [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end
'
?
甚至像这样:
EXEC sp_MSforeachtable '
if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = ''?'' and column_name = ''CreatedOn'')
begin
ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end
'
链接地址: http://www.djcxy.com/p/76317.html
上一篇: Add a column if it doesn't exist to all tables?
下一篇: Change a Nullable column to NOT NULL with Default Value