0

.sqlファイルにSQLスクリプトがあります。このように定義されたパラメータがいくつかあります

DECLARE @device_directory NVARCHAR(250) = '$(CONFIG_DBPATH)'+'$(CONFIG_DBNAME)'

次に、このスクリプトを.batスクリプトで実行します。

SET CONFIG_DBNAME=NewConfigBase
SET CONFIG_DBPATH=C:\BT_Server\
sqlcmd -I -S .\SQLEXPRESS8  -i SetUpConfigDb.sql

構成ツールの一部としてこの機能を実装するタスク、つまり物理dbファイルを作成してデータベースに添付するタスクが割り当てられました。後で、データベーステーブル、ストアドプロシージャなどの作成も含めます。これらは、現在、別の.sqlスクリプトで定義されています。

理想的には、構成ツールがsqlcmdに依存せず、スクリプトをインプロセスで実行するようにします(たとえば、SqlCommandを使用して)。これにより、sqlcmdの出力を解析するのではなく、標準のエラー処理(例外)を使用できるようになります。

今、私はこれに取り組む方法が少しわかりません。同じタスクを実行する2つの異なるSQLクエリを維持せずに、.batスクリプトを引き続き使用できるように、既存のSQLスクリプトを再利用できるようにしたいと考えています。

スクリプトの1つには、いくつかの場所にGOが含まれています。SqlCommandではこれが許可されていないことを理解しています。また、SqlParameterを使用して$(CONFIG_DBPATH)などの値を設定できるかどうかもわかりません(実際、できないことはほぼ確実です)。

だから私の質問は、このシナリオに取り組むための推奨される方法は何ですか?GOを使用して.sqlコマンドを実行するにはどうすればよいですか。また、.batファイルとマネージコードの両方からスクリプトを使用できるように変数を指定するにはどうすればよいですか。1つのオプションは、スクリプトがコードから実行されるときにスクリプトを「ウォッシュ」し、GOなどを削除し、変数の処理方法を変更することだと思います。しかし、もっと良いオプションはありますか?

4

1 に答える 1

1

プログラムでsqlcommandを介してsqlスクリプトを実行する場合は、ファイルを開いて1行ずつ読み取る必要があります。各行を渡すときに、それを現在のバッチ文字列ビルダーに追加し、トリミング後にGOである行に到達したら、文字列ビルダーToStringを取得して、そのバッチを実行します。現在のバッチをクリアして続行します。

編集:質問の2番目の部分パラメーターに関しては、解析と実行の一部としてパラメーターを置き換えるか、DBの作成などの役割をC#コードに引き出すことができます。好みとして、デプロイメントの一部としてC#コードで実行されたとしても、開発者がssmsとsqlcmdで実行できるSQLスクリプトを常に保持しています。つまり、あなたのコードだけが理解できる特別なトークンは作成しません。質問のままにして、それらを置き換え、スクリプトでその上に変数を宣言してコメントアウトすることができます。これにより、開発者はssmsで簡単に作業できます。

于 2011-09-05T12:11:54.147 に答える