SQLスクリプトをSQLCMDモードで整理しようとすると、問題が発生しました。
_:setvar db_suffix "some_suffix"
:setvar some_db "some_db_$(db_suffix)"
print 'some_db: $(some_db)'
_
その出力は次のとおりです。
_some_db: some_db_$(db_suffix)
_
しかし、私が期待したのは:
_some_db: some_db_some_suffix
_
このような可変補間を行う方法はありますか?
(変数をデータベース名として使用するため、CONCAT()
などのT-SQL関数は機能しません)。
このような可変補間を行う方法はありますか?
ある意味では、ちょっと。直接ではない。
あなたはいくつかのことを覚えておく必要があります:
_:setvar
_を介して変数に設定する値は、単純なリテラル値です。これは、次の2行を実行するだけで確認できます。
_:setvar var1 $(var2)
PRINT '$(var1)';
_
これは次を返します:
_$(var2)
_
SQLCMD/SQLCMDモードが何らかの方法で_:setvar
_の値の部分を解析しようとした場合、$(var2)
が定義されていないときにエラーが発生します。
変数置換は、他の一部のSQLCMDコマンドで許可されています。
これは、たとえば、SQLCMD変数をそのコマンドラインに渡しながらシェルコマンドを実行できることを意味します。
_:setvar db_suffix some_suffix
!! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt
_
上記の2行は、「:setvar other_db [MyDB _ $(db_suffix)]」というテキストでファイルC:\ TEMP\setvar.txtを作成/上書きします。ここで、$(db_suffix)
は、「some_suffix」の値に置き換えられます。
_:r
_コマンドを介してインポートされたファイル/スクリプトのSQLCMDコマンドは、2番目のパスで処理され、これらの外部ファイルに設定された変数をメインスクリプトに反映できます。
_:setvar db_suffix some_suffix
!! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt
:r C:\TEMP\setvar.txt
PRINT 'somethin_somethin: $(other_db)';
_
戻り値:
_somethin_somethin: [MyDB_some_suffix]
_
SQLCMDコマンドはバッチごとに解釈されます!!したがって、連結された値を変更する場合は、一時ファイルの作成と読み取りをそれぞれ分離する必要があります。そうでない場合、取得する値は、すべての_!!
_と_:r
_コマンドは変数値が代入される前に処理され、その後バッチをSQL Serverに送信してT-SQLを処理できます。例えば:
_:setvar db_suffix some_suffixes
!! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt
:r C:\TEMP\setvar.txt
PRINT 'somethin_somethin: $(other_db)';
--GO
!! echo :setvar other_db [NotMyDB_$(db_suffix)22] > c:\TEMP\setvar.txt
:r C:\TEMP\setvar.txt
PRINT 'somethin_somethin2: $(other_db)'
_
戻ります:
_somethin_somethin: [NotMyDB_some_suffixes22]
somethin_somethin2: [NotMyDB_some_suffixes22]
_
しかし、_--GO
_のコメントを外すと、次のようになります。
_somethin_somethin: [MyDB_some_suffixes]
somethin_somethin2: [NotMyDB_some_suffixes22]
_
少しトリッキー
:setvar var2 'aaa'
:setvar var1 "'$var2'"
PRINT '$var2 =' + $(var2);
PRINT '$var1 =' + $(var1);
PRINT '$var1 =' + REPlACE( $(var1) , '$var2' , $(var2) );
出力
$var2 =aaa
$var1 =$var2
$var1 =aaa