ede*_*ter 3 sql-server distinct
我有 100 个来自客户的数据库,它们都具有相同的架构但内容不同。
现在我想进行一些分析,并开始在所有数据库上运行不同的一列。我的实例包含这些和更多。
我认为它接近
EXEC sp_MSforeachdb 'Use ? select distinct [ColumName] from [TableName]'
Run Code Online (Sandbox Code Playgroud)
然而,这并没有将它们结合起来。用 a 包围这个select
也不起作用。
另一个答案的早期版本存在一些问题,所以我将把它放在这里,作为同一事物的一个略有不同的版本:
应避免通过变量进行字符串聚合,您应该使用STRING_AGG
或FOR 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)