2012-09-30 118 views
2

我有一組SQL服務器分佈在25個位置,它們都具有相同的數據庫。我可以使用管理控制檯手動連接所有人員。在「新建查詢」下的服務器管理控制檯中,我想了解如何用一個循環打包查詢或一組t-sql語句,該循環將首先建立與其中一臺服務器的連接,指定數據庫,然後運行查詢/語句。這樣,如果我需要在所有數據庫上運行常見查詢(如更新數據庫),則不必手動連接到每個數據庫,展開控制檯,單擊數據庫,然後單擊「新建查詢」。 「如何使用T-SQL從管理控制檯連接到SQL

服務器都命名爲wsrv01,wsrv02,wsrv03等,所以我可以很容易地通過名稱循環;我只是不知道如何做循環或建立連接。

這是一種獨特的環境......我過去在其他項目中使用過RedGate並且喜歡它;但這是一種不同的情況。

基本上,我想避免這樣做,並深入到每個服務器運行一個查詢:

enter image description here

+0

什麼是SQL事件探查器顯示? – davek

+10

請參閱[同時針對多個服務器執行語句(SQL Server Management Studio)](http://msdn.microsoft.com/zh-cn/library/bb964743.aspx) –

+0

我認爲我需要的是更多沿着sql腳本,它創建與服務器和數據庫的連接,然後在循環內執行t-sql語句。 –

回答

0

如果你真的不能使用別的東西..嘗試創建一個鏈接服務器。這樣,你可以查詢簡單的方法如..

select * from <linkedserver>.<database>.<schema>.<object> 
0

從馬丁Smaith答案是我的首選解決方案,但我可以建議其他2種方式:

1)您可以在使用「SQLCMD模式」 SSMS。

它看起來像:

:connect MyServer -U MyLogin -P MyComplexPassword 
--Then have some code 

:connect MyOtherServer ... 
--Then have some code 

但你不能循環,所以你將不得不重複的代碼。

或者

2)您可以創建一個FOR循環的服務器列表上的CMD文件。這是我自己釀造的一個例子。只需複製將其粘貼到REQ.CMD,並創建一個名爲SERVERS.LST的文本文件,每行使用一個服務器名稱。連接將通過Windows身份驗證。如果是在後臺運行,而你手動連接,您可以更改爲OSQL SQLCMD,如果你喜歡,但OSQL應與SQL 2008年工作

REM To execute a SQL command or file to multiple servers 
REM Using a server list file 
REM And using 2 kind of parameters (script file or query) 
REM Pollus Brodeur - June 2007 
@echo off 

set PARAM1=%1 
set PARAM2=%2 
set PARAM3=1 

REM You need at least 1 parameter 
if x==%1x goto ERROR1 
if EXIST %PARAM1% (set ISFILE=1) else (set ISFILE=0) 

REM Setting Servers List File and verify file existance or X 
if x==%2x (set PARAM2=servers.lst) 
if X==%2 (set PARAM3=0 & set PARAM2=servers.lst & goto MAIN) 
if NOT EXIST %PARAM2% (goto ERROR2) 

REM Not interactive 
if X==%3 (set PARAM3=0) 

:MAIN 
echo =============================================================================== 
echo REQ - Execute a SQL command or file to multiple servers using a list file 
echo %DATE% %TIME% 
if %PARAM3%==0 (echo Non Interactive mode) 
echo =============================================================================== 

if %ISFILE%==0 (GOTO COMMAND) 

echo For following file : 
echo %PARAM1% 
goto EXEC 

:COMMAND 
echo For following command : 
echo %PARAM1% 

:EXEC 
echo =============================================================================== 
echo For following servers : 
type %PARAM2% 
echo =============================================================================== 

if %PARAM3%==1 (echo Interactive mode. Use X parameter to deactivate & pause) 

echo Exec... 
if NOT EXIST .\out mkdir out 
if EXIST out\req.out (del out\req.out) 
if %ISFILE%==0 (GOTO COMMAND1) 

for /F %%a in (%PARAM2%) do echo %%a & osql -S %%a -E -n -h-1 -w 9999 -u -i %PARAM1% -o out\req.out.%%a.txt 
goto ENDEXEC 

:COMMAND1 
for /F %%a in (%PARAM2%) do echo %%a & osql -S %%a -E -n -h-1 -w 9999 -u -Q %PARAM1% -o out\req.out.%%a.txt 

:ENDEXEC 
type out\req.out.*.txt >> out\req.out 2>&1 
echo =============================================================================== 
echo Execution is done. Output files are in .\out 
echo more /E /C out\req.out.*.txt 
echo more out\req.out 
echo =============================================================================== 
if %PARAM3%==1 (pause) 
goto END 

:ERROR1 
goto CALLEXAMPLE 

:ERROR2 
echo Error: Server File List named %PARAM2% doesn't exists 
goto CALLEXAMPLE 

:CALLEXAMPLE 
echo -------------------= REQ call examples =-------------------- 
echo REQ.cmd Param1 Param2 Param3 
echo Param1 = command or scriptfile.sql {mandatory} 
echo Param2 = servers list file {servers.lst per default} 
echo Param3 = X {for non interactive mode} 
echo ------------------------------------------------------------ 

:END 
相關問題