2017-08-21 111 views
1

我需要在許多數據庫上運行以下查詢,我有超過100多個數據庫,但我不想拉起每個數據庫並一次運行一個查詢。SQL查詢所有數據庫

用戶表僅在Database#_Account中列出。

如果查詢運行錯誤,因爲Database#_Admin沒有User表。

(示例數據庫列表)

Database: 
--------------------- 
MASTER 
Model 
msdb 
tempdb 
Database1_Account 
Database1_Admin 
Database2_Account 
Database2_Admin 
Database3_Account 
Database3_Admin 

查詢:

EXEC sp_MsForEachDb @command1 = SELECT "?" as DatabaseName, * 
           FROM ?.User 
           WHERE Name = "John" AND "?" LIKE "%_Account" 
+0

只是建立一個DINAMIC查詢https://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql -server/ –

+0

另外你首先需要檢查表是否存在。 https://stackoverflow.com/questions/167576/check-if-table-exists-in-sql-server –

+0

我遇到的問題是隻在選定的數據庫上運行查詢。我查看了動態查詢,但沒有提到有關搜索選擇數據庫的任何信息。 –

回答

2

ms_foreachDb仍是一個未公開的函數,它受到隨時更改。我會用一個光標來做這樣的事情。

這裏是一個工作模板,讓你開始:

DECLARE @tsql nvarchar(max) 
DECLARE @dbname varchar(500) 

DECLARE MyCur CURSOR STATIC FORWARD_ONLY FOR 
    SELECT [name] 
    FROM sys.databases 
    WHERE [name] NOT IN ('tempdb') 

OPEN MyCur 

WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM MyCur INTO @dbname 

    IF @@FETCH_STATUS <> 0 
     BREAK 

    SET @tsql = 'use ' + @dbname + ' SELECT * FROM sys.tables' 
    EXEC sp_executesql @tsql 
END 

CLOSE MyCur; 
DEALLOCATE MyCur;  
+0

這工作就像我想要的。 –

0
  1. 你需要通過命令作爲一個nvarchar的文字,而不是作爲一個查詢。
  2. 您需要使用正確的術語。您已經遺漏了模式名稱。它是Database.Schema.Table,而不是Database.Table。我假設所有的表都使用默認的dbo模式。
  3. 編寫查詢以測試執行前表是否存在。最簡單的方法是使用IF OBJECT_ID(N'TableName') IS NOT NULL
  4. 避免雙引號。它們通常是像方括號這樣的字段標識符,所以它們在用於varchar文字時可能不明確。

嘗試:

EXEC sp_MsForEachDb @command1 = N'IF OBJECT_ID(N''?.dbo.User'') IS NOT NULL SELECT ''?'' as DatabaseName, * FROM ?.dbo.User WHERE Name = ''John'' AND ''?'' LIKE ''%_Account''' 
+0

消息:命令(s)成功完成,但沒有給我什麼數據庫的結果或顯示我約翰在該數據庫被發現。 –

+0

@JohnWilliams您是否正在運行一個查詢,您知道應該爲一個數據庫返回數據?嘗試針對該數據庫運行該查詢。您的用戶表是在dbo架構中,還是使用其他的? –