2012-09-30 70 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 
相关问题