私は最近、この問題をいじっていました。私の場合、内部にドットとスペースを含む変数がありました。実行しようとしたすべての組み合わせをリストします。
テスト SQL ファイル test.sql
declare @testvar varchar(30);
set @testvar = '$(testvar)';
print @testvar;
私のテスト変数のセット:
$varA = 'Abc1.3,Abc4.3' # contains only dots
$varB = 'A bc1.3,Ab c4.3' # contains dots and spaces
$varC = 'xx x.yy,y,.1.2.,3 , y' # contains dots and multiple spaces
sqlcmdコマンドのテスト
sqlcmd -v testvar=`"$var`" -i test.sql
sqlcmd -v testvar=($var) -i test.sql
sqlcmd -v testvar=("""$var""") -i test.sql # Solution by Andrei Shakh
a) テスト #1
最初に、PowerShell スクリプトがスペースを含む変数でエラーを返していることがわかりました。
sqlcmd -v testvar=`"$varA`" -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=`"$varB`" -i test.sql
sqlcmd : Sqlcmd: 'testvar="A bc1.3,Ab c4.3""': Invalid argument. Enter '-?' for help. At line:2 char:1
b) テスト #2
最後に、変数を二重引用符の代わりに括弧で置き換える解決策を見つけましたが、!
sqlcmd -v testvar=($varA) -i test.sql
sqlcmd : Sqlcmd: ',Abc4.3': Invalid argument. Enter '-?' for help. At line:1 char:1
sqlcmd -v testvar=($varB) -i test.sql
A bc1.3,Ab c4.3
興味深いことに、このソリューションは変数内のドットでは機能しないことがわかりました。
c) テスト #3
変数内のスペースに一致するスクリプトを作成しました。その場合は、括弧を使用します。これは、両方の方法で機能します。
If ($var -match " ") # or ($var -like "* *")
{
sqlcmd -v testvar=($var) -i test.sql
}
Else
{
sqlcmd -v testvar=`"$var`" -i test.sql
}
d) 最終的な解決策
これまでのところ、私が見つけた最良の解決策はAndrei Shakh here による回答でした。これは、IF/ELSEステートメントを使用せずにすべてで機能し、文字列にスペースがあるかどうかを確認します。
sqlcmd -v testvar=("""$varA""") -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=("""$varB""") -i test.sql
A bc1.3,Ab c4.3
sqlcmd -v testvar=("""$varC""") -i test.sql
xx x.yy,y,.1.2.,3 , y