我正在使用SQL Server。我想将一个名为[DateCreated]的列添加到多个表中。是否可以使用单个语句将此列添加到数据库中的所有表中?
我偶然发现了Joe Steffaneli的回答,其中他提出了一个查询,该查询又返回包含Alter表语句的行。 查询如下:
select 'alter table ' + quotename(s.name) + '.' + quotename(t.name) + ' add [DateModified] datetime'
from sys.columns c
inner join sys.tables t
on c.object_id = t.object_id
inner join sys.schemas s
on t.schema_id = s.schema_id
left join sys.columns c2
on t.object_id = c2.object_id
and c2.name = 'DateModified'
where c.name = 'DateCreated'
and t.type = 'U'
and c2.column_id is null /* DateModified column does not already exist */
有没有办法可以执行返回的行?对不起英文。
答案 0 :(得分:9)
你可能需要这样的东西。在运行之前检查脚本是否符合要求(添加一个默认值为getdate()
的非空列)!
DECLARE @Dynsql nvarchar(max)
SET @Dynsql = ''
SELECT @Dynsql = @Dynsql + '
alter table ' + QUOTENAME(SCHEMA_NAME(schema_id))+ '.' + QUOTENAME(name) +
' add [DateCreated] datetime not null default getdate()'
FROM sys.tables
WHERE type='U' and object_id NOT IN (select object_id from sys.columns where name='DateCreated')
EXEC (@Dynsql)
答案 1 :(得分:1)
此存储过程正常
USE databaseName;
exec sp_msforeachtable 'alter table ? Add [DateCreated] datetime not null default getdate()';
答案 2 :(得分:0)
declare @i int
set @i=1
while(@i<45)
begin
declare @sql varchar(200)
with TempTable as (select Row_number() over(order by stdID) as RowNo,* from SomeTable)
select @sql= 'alter table Table'+(select Name from TempTable where RowNo=@i)+' add NewColumn int'
exec (@sql)
set @i=@i+1
end
答案 3 :(得分:-1)
不,没有单个语句可以向数据库中的所有表添加列。
下次请使用您正在使用的RDBMS标记您的问题。如果有办法,我们将无法在不知道您正在使用哪个数据库系统的情况下为您提供命令。