我正在针对实例中的所有数据库运行查询。有一些数据库具有相同的模式(表和所有)。
这是查询:
EXEC sp_MSforeachdb 'Use ? SELECT top 1 Column1, Column2 from [TableName]where Column3 = ''SpecificValue'' order by Column4 desc'
查询工作正常并返回我想要的结果,但不是我想要的结果。
运行此查询后,在结果窗格中,每个数据库都会得到一个迷你表格,所以我最终得到了一些数据库。这是非常不切实际的,它迫使我逐个复制结果。
有没有办法重写此查询,以便它将所有结果返回到包含2列的表中。我希望每一行都像
第1列的值来自db 1 \ column2的值d来自db1
第2列的值来自db 2 \ column2的值d来自db2
第3列的值来自db 3 \ column of column2 d from db3
依旧......
答案 0 :(得分:1)
您可以使用全局临时表:
CREATE TABLE ##tmpTable(DBName VARCHAR(MAX),Content VARCHAR(MAX));
EXEC sp_MSforeachdb 'Use ? INSERT INTO ##tmpTable SELECT TOP 1 ''?'', TABLE_NAME FROM INFORMATION_SCHEMA.TABLES'
SELECT * FROM ##tmpTable;
GO
DROP TABLE ##tmpTable;
答案 1 :(得分:0)
虽然有些情况可能需要全局临时表,即“##”,但我试图偏离它们。相反,您仍然可以使用单个基于会话的临时表,即“#”或表变量,只需采用动态SQL方法来解决问题。
这是另一种选择:
#tmp
。 以下是代码:
create table #tmp (
database_id int,
database_name varchar(128),
object_id int,
object_name varchar(128));
declare
@Sql varchar(max) = (
select 'insert #tmp (database_id, database_name, object_id, object_name) select ' + convert(varchar(128), database_id) + ', ''' + name + ''', object_id, name from ' + name + '.sys.objects;'
from sys.databases
where name in ('master', 'msdb', 'tempdb')
for xml path(''));
exec (@Sql);
select
database_name,
object_count = count(*)
from #tmp
group by
database_name
order by
1;
以下是上述小组的结果:
database_name object_count --------------------- ------------ master 116 msdb 1194 tempdb 81