Sco*_*ord 29 sql t-sql sql-server alter-table sql-server-2008
我正在使用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
'
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
错误102:'@tblname'附近的语法不正确.'CreatedOn'附近的语法不正确.'@tblname'附近的语法不正确.'CreatedOn'附近的语法不正确.......等等,每张桌子.
Rem*_*anu 27
您不能在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';
Run Code Online (Sandbox Code Playgroud)
您需要混合一些动态 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
'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19587 次 |
| 最近记录: |