2016-09-05 62 views
1

我知道我的文章與本論壇中的其他文章有非常相似的標題,但我確實找不到我需要的答案。在多個數據庫上執行SQL查詢

這是我的問題,我有我的Windows服務器上運行的SQL Server。在我的SQL Server裏面,我有大約30個數據庫。他們都有相同的表格和相同的存儲過程。

現在,這裏是問題,我有這個龐大的腳本,我需要在所有這些數據庫中運行。我希望我可以在所有的數據庫中只做一次。

我嘗試了一些東西,如去「查看」>>註冊服務器>>本地服務器組>>新服務器註冊。但是這個解決方案適用於很多服務器,而不是很多數據庫

我知道我可以通過鍵入數據庫名稱來完成,但查詢真的很龐大,所以在所有數據庫中運行都需要很長時間。

有沒有人有任何想法,如果這是可能的?

+1

不能縮短執行對不同的數據庫查詢所需的時間。這似乎是[DBA上發佈的問題的重複](http://dba.stackexchange.com/questions/907/how-to-execute-sql-against-all-dbs-on-a-server),應該幫助你:-) –

+0

爲什麼鍵入數據庫名稱需要很長時間才能在所有數據庫中運行? – GuidoG

+0

您可以使用EXEC sp_MSforeachdb @stored_procedure。 , –

回答

4

ApexSQL Propagate是在這種情況下可以提供幫助的工具。它用於在多個數據庫,甚至多個服務器上執行單個或多個腳本。你應該做的是簡單地選擇腳本,然後選擇所有數據庫要針對其執行該腳本:

select databases

當加載腳本和數據庫,你應該只需點擊「執行」按鈕,等待結果:

click the execute button

1

這是這樣做的正常方式:

假設你想要做一個選擇數據庫DBOther那將是比:

select * from DBOther..TableName 

而且檢查表或視圖上dbo架構,如果不是你應該添加架構也:請注意我只用一個點,現在的數據庫名稱

select * from DBOther.dbo.ViewName 

如果在後y數據庫位於另一臺計算機上的另一臺服務器上,而不是確保數據庫位於鏈接服務器中。

SELECT * FROM [AnotherServerName].[DB].[dbo].[Table] 

這裏是不要求輸入數據庫名稱另一種方式:
然後你就可以通過訪問該數據庫中的表或視圖

use DB1 
go 

select * from table1 
go 

use DB2 
go 

select * from table1 
go 

請注意,這只是工作如果表和字段在每個數據庫上完全相同

2

您可以編寫像這樣的腳本

DECLARE CURSOR_ALLDB_NAMES CURSOR FOR 
SELECT name 
FROM Sys.Databases 
WHERE name NOT IN('master', 'tempdb') 

OPEN CURSOR_ALLDB_NAMES 

FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME 

WHILE @@Fetch_Status = 0 
BEGIN 
    EXEC('UPDATE '+ @DB_NAME + '..SameTableNameAllDb SET Status=1') 
    FETCH CURSOR_ALLDB_NAMESINTO INTO @DB_NAME 
END 

CLOSE CURSOR_ALLDB_NAMES 
3

考慮從SSMS(查詢 - SQLCMD模式)運行SQLCMD Mode中的腳本。這樣,您可以將腳本保存到文件並輕鬆地在每個所需數據庫的上下文中運行它:

USE DB1; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB2; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB3; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
+0

Dan Guzman,我認爲你的建議是最好的辦法,因爲我的文件有大約45000行代碼。我要去嘗試一下,我讓每個人都知道!非常感謝 –

0

丹的答案解決了我的問題! 只需觀察一次,我必須在SQL Server Management的「查詢」選項卡上啓用SQLCMD模式。此外,文件的路徑不能有空格。 我感謝您的幫助!

+0

請將您的評論移至回覆您的評論。這本身並不是一個答案。 – Oliver

+0

嘿@奧利弗,我很抱歉,但我不明白你要我做什麼。您希望我刪除我的答案並將其作爲某人答案的評論發佈,是嗎? –

+0

是的,@Arthur,這就是我所說的:-) – Oliver