我有 100 个来自客户的数据库,它们都具有相同的架构但内容不同。
现在我想进行一些分析,并开始在所有数据库上运行不同的一列。我的实例包含这些以及更多。
我认为它接近
EXEC sp_MSforeachdb 'Use ? select distinct [ColumName] from [TableName]'
但是,这并没有将它们结合起来;用 a 包围这个select
也不起作用。
我有 100 个来自客户的数据库,它们都具有相同的架构但内容不同。
现在我想进行一些分析,并开始在所有数据库上运行不同的一列。我的实例包含这些以及更多。
我认为它接近
EXEC sp_MSforeachdb 'Use ? select distinct [ColumName] from [TableName]'
但是,这并没有将它们结合起来;用 a 包围这个select
也不起作用。
另一个答案的早期版本存在一些问题,所以我将把它放在这里,作为同一事物的稍微不同的版本:
应避免通过变量进行字符串聚合,应使用
STRING_AGG
orFOR XML
代替您必须使用
QUOTENAME
引用数据库名称,以防有字符需要引用。例如,考虑如果有一个名为
My]Database
或的数据库会发生什么My]..SomeTable;DROP DATABASE OtherDatabase; --
。解决方案:
您正在寻找的是
UNION
operator,尽管我认为您不能将其与该sp_MSforeachdb
过程一起使用。操作员会UNION
自动为您删除重复项。最简单的解决方案可能是预先创建一个
#TempTable
并在您的调用中利用它,sp_MSforeachdb
如下所示:这是我最终使用的代码: