为具有相同表名的多个数据库添加一列



我在堆栈交换上看到了一个类似的问题,但对我来说太复杂了,我不理解。

下面是数据库。

Carl_Retail   > Tables > Clothes
Tom_Retail    > Tables > Clothes
Bob_Retail    > Tables > Clothes
Thomas_Retail > Tables > Clothes

因此,对于我的情况,还有更多的数据库,我不想手动操作。对于一张桌子,你可以做:

ALTER TABLE table_name
ADD column_name datatype;

我想做同样的事情,但对于";衣服;桌子条件是每个数据库具有"_零售;

我基本上想为每个以名称"结尾的数据库运行一个脚本_零售;并在";衣服;表名为";袜子";。

我知道一个循环,很可能是一个光标,可能是你的第一个想法。我非常不喜欢循环,并尽可能避免循环。即使在这种情况下,也不需要循环。由于您希望在所有数据库中使用名称末尾的_Retail来更改这一点,因此我们可以使用sys.databases并生成一些动态sql。这应该会让你非常接近。

declare @SQL nvarchar(max) = N''
select @SQL = @SQL + N'if not exists(select *
from ' + quotename(d.name) + N'.sys.columns c
join ' + quotename(d.name) + N'.sys.tables t on t.object_id = c.object_id
where t.name = ''table_name''
and c.name = ''column_name'')alter table ' + quotename(d.name) +  N'.dbo.table_name ADD column_name int;'
from sys.databases d
where d.name like '%[_]Retail'
--use the below to evaluate your dynamic sql
select @SQL
--uncomment the below line when you are comfortable your dynamic sql is correct
--exec sp_executesql @SQL

--编辑--已修改以适应新列已存在的可能性。

最新更新