2

私は、すべて同じデータベースを持つ25の場所に分散したSQLサーバーのグループを持っています。管理コンソールを使用して、それらすべてに手動で接続できます。[新しいクエリ]の下のサーバー管理コンソールで、クエリまたはt-sqlステートメントのグループをループでラップする方法を学びたいと思います。ループは最初にサーバーの1つに接続し、データベースを指定してから、クエリ/ステートメントを実行します。このように、データベースの更新など、すべてのデータベースで共通のクエリを実行する必要がある場合は、各データベースに手動で接続し、コンソールを展開してデータベースをクリックし、[新しいクエリ]をクリックする必要はありません。 「」

サーバーにはすべてwsrv01、wsrv02、wsrv03などの名前が付けられているため、名前を簡単にループできます。ループを実行する方法や接続する方法がわかりません。

これは一種のユニークな環境です...私は過去に他のプロジェクトでRedGateを使用し、それが大好きです。しかし、これは別の状況です。

基本的に、クエリを実行するためにこれを実行して各サーバーにドリルダウンする必要はありません。

ここに画像の説明を入力してください

4

2 に答える 2

0

Martin Smaithからの回答は私の好みの解決策ですが、他に2つの方法を提案できます。

1)SSMSで「SQLCMDモード」を使用できます。

次のようになります。

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

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

ただし、それをループすることはできないため、コードが繰り返されます。

または

2)サーバーのリストに基づいてFORループを使用してCMDファイルを作成できます。これが私自身の醸造の例です。コピーしてREQ.CMDに貼り付け、1行にサーバー名を含むSERVERS.LSTという名前のテキストファイルを作成します。接続はWindows認証されます。必要に応じてSQLCMDのOSQLを変更できますが、OSQLはSQL2008で動作するはずです。

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
于 2012-10-10T17:01:22.947 に答える
0

他に何も使えない場合は、リンクサーバーを作成してみてください。そうすれば、次のような簡単な方法でクエリを実行できます。

select * from <linkedserver>.<database>.<schema>.<object>
于 2012-10-02T13:21:52.667 に答える