1

毎週のスプリントの後に、多数の MSQL スクリプトがドロップされるフォルダーがあります。たとえば、今日、10 個のスクリプトがフォルダーに配置されました。次に、各スクリプトを個別に開き、該当するデータベースに対して実行する必要がありました。実行する必要があるデータベースは、ファイルの名前にあります。例 [2] [CRMdata]UpdateProc.sql

[2] は実行される順序を表すため、スクリプト [1] はその前に実行する必要があります。[CRMdata] は、実行するデータベースです。

このプロセスは、特に 50 個のスクリプトを連続して実行する場合は非常に面倒です。これを行う簡単な方法があるかどうか疑問に思っていましたか?ファイル名を読み取り、スクリプト番号に基づいてスクリプトを順番に実行するだけでなく、ファイル名で指定されたデータベースに対してスクリプトを実行する .bat ファイルを Perhpas します。

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

MSQL で SQL を実行することについては何も知りません。MSQL 用に提供されているコマンドライン ユーティリティを使用して、適切なデータベースに対して各スクリプトを実行する方法を検討する必要があります。

SQL ファイルを正しい順序で並べ替え、データベースの名前を解析するバッチ ファイルの作成をお手伝いします。

シーケンス番号の前にゼロを付けて幅を一定にすると、ジョブはバッチではるかに簡単になります。ファイルの名前を変更しても問題ないと思います。それがこのソリューションの機能です。

また、処理するファイルが 999 個を超えることはないと仮定しました。コードを簡単に変更して、より多くの処理を行うことができます。

!ファイル名に文字が含まれている場合は、展開が遅れると FOR 変数の展開が破損するため、いくつかの変更を行う必要があります。しかし、それはありそうもない問題です。

@echo off
setlocal enableDelayedExpansion

:: Change the definition to point to the folder that contains the scripts
set "folder=sqlCodeFolder"

:: The mask will only match the pattern that you indicated in your question
set "mask=[*] [*]*.sql"

:: Rename the .sql files so that the sequence numbers are zero prefixed
:: to width of 3. This enables the default alpha sort of the directory to be
:: in the proper sequence
for /f "tokens=1* delims=[]" %%A in ('dir /b "%folder%\%mask%"') do (
  set seq=00%%A
  ren "%folder%\[%%A]%%B" "[!seq:~-3!]%%B"
)

::Process the renamed files in order
for %%F in ("%folder%\%mask%") do (
  for /f "tokens=2 delims=[] " %%D in ("%%~nF") do (
    rem %%F contains the full path to the sql file
    rem %%D contains the name of the database, without enclosing []
    rem Replace the echo line below with the proper command to run your script
    echo run %%F against database [%%D]
  )
)
于 2012-05-24T15:01:07.383 に答える
0

まず、何かを実行する必要がある場合は、SQL Server ジョブ エージェントの使用を検討してください。これは、単純なことをスケジュールするのに適した方法です。

このようなタスクには、PowerShell と "sqlcmd" を組み合わせることをお勧めします。このコマンドは、コマンド ラインからスクリプトを実行するため、実際には質問に対する答えです。

ただし、さらに一歩進んでください。週に 1 回 (またはいつでも実行したいときに) 実行するジョブをスケジュールします。1 つのステップ (PowerShell スクリプト) で構成されるようにします。これにより、ディレクトリ内のすべてのスクリプトがループされ、名前からファイル名が抽出され、sqlcmd を使用してスクリプトが実行されます。途中で、何をしているかを表に記録して、エラーを見つけられるようにします。

于 2012-05-24T13:09:49.390 に答える