从多个数据库中选择不同的列值

ede*_*ter 3 sql-server distinct

我有 100 个来自客户的数据库,它们都具有相同的架构但内容不同。

现在我想进行一些分析,并开始在所有数据库上运行不同的一列。我的实例包含这些和更多。

我认为它接近

EXEC sp_MSforeachdb 'Use ? select distinct [ColumName] from [TableName]'
Run Code Online (Sandbox Code Playgroud)

然而,这并没有将它们结合起来。用 a 包围这个select也不起作用。

Cha*_*ace 6

另一个答案的早期版本存在一些问题,所以我将把它放在这里,作为同一事物的一个略有不同的版本:

  • 应避免通过变量进行字符串聚合,您应该使用STRING_AGGFOR XML代替

  • 您必须使用QUOTENAME来引用数据库名称,以防有需要引用的字符。

    例如,考虑如果有一个名为My]Database、 或的数据库会发生什么My]..SomeTable;DROP DATABASE OtherDatabase; --

解决方案:

DECLARE @DynamicSQL nvarchar(max) =
(
    SELECT STRING_AGG(CAST(N'
SELECT [ColumnName] 
FROM ' + QUOTENAME(D.[name]) + '.SchemaName.TableName
'
        AS nvarchar(max)), N'
UNION
')
    FROM sys.databases
);

PRINT @sql;  -- for testing

EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)