2016-06-10 73 views
2

我對一個實例中的所有數據庫運行查詢。有一些具有相同模式的數據庫(表格和全部)。T-SQL查詢將結果返回到單個表中

這是查詢:

EXEC sp_MSforeachdb 'Use ? SELECT top 1 Column1, Column2 from [TableName]where Column3 = ''SpecificValue'' order by Column4 desc' 

的查詢工作好嗎,並返回我想要的結果,但不是在某種程度上,我希望他們。

運行此查詢後,在結果窗格中,我爲每個數據庫獲取一個迷你表,因此我最終得到了一些迷你表。這是非常不切實際的,它迫使我一個接一個地複製結果。

enter image description here

有沒有一種方法,使其返回所有結果傾朝野表2列重寫此查詢。我想每一行像從列2 DFROM DB1的分貝1個\值塔1的

從分貝2 \值COLUMN2 DFROM DB2的塔1的

值塔1的值從數據庫列2 DFROM DB3的3 \值

等等...

+3

http://stackoverflow.com/a/654418/726127 – Brad

+0

謝謝布拉德。這當然可能是這樣做的方式之一。 – QWE

回答

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; 
+0

謝謝!它確實是我想要的。 – QWE

0

雖然有些情況下可能需要全局臨時表,即「##」,但我會試圖偏離它們。相反,您仍然可以使用單個基於會話的臨時表(即「#」)或表變量,只需採用動態SQL方法即可解決問題。

下面是一個替代:

  • 創建一個臨時表,例如#tmp
  • 創建要運行的SQL的單個可執行字符串。該字符串將包含每個數據庫的查詢。
  • 然後只需執行SQL字符串。

下面是代碼:

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