16

sqlcmd.exe を実行して SQL スクリプトを実行する powershell スクリプトを作成しようとしています。スクリプトには、sqlcmd の -v スイッチを介してコマンド ラインで渡したい SQLCMD 変数が含まれています。問題は、変数の 1 つの値としてパスを渡すと、PowerShell が奇妙なことを行っているため、SQL スクリプトが失敗することです。

たとえば、私は呼び出しています:

$path = 'C:\path'
sqlcmd -SMySQLServerInstance  -i 'MySqlScript.sql'  -v MyVariablePath=$path

実行すると、次のようなエラーが表示されます。

Sqlcmd: ':\path': Invalid argument.

$path私が試した、またはMyVariablePath=$path 問題を解決した二重引用符または単一引用符の量はありません。

これを行う必要がある方法の簡単な標準的な例を誰かが提供できますか?

4

4 に答える 4

20

ついにそれを解決しました。次の吸盤がこれを試すには、ここに解決策があります

powershellスクリプトは次のようになります

$myPath = "`"C:\Path`"" 
sqlcmd.exe -SmySQLInstance -i./test.sql -v myvar=$myPath

私のtest.sqlファイルは、このような変数を使用できます

PRINT "$(myvar)"

ここで重要なのは、powershell が文字をエスケープする方法を理解することです。詳細はこちら

于 2010-09-21T18:21:56.723 に答える
2

同じ問題があり、誤って解決策を見つけましたが、なぜそれが機能するのかまだわかりません:)(ただし、私はpowershellのプロではありません):

sqlcmd -d ... -s ... -v Var1Name=("""$PowershellVar1""") Var2Name=("""$PowershellVar2""")

変数は PS スクリプトで文字列型$PowershellVar1$PowershellVar2持ち、引用符やスペースなどを含めることができます

于 2014-06-30T12:26:30.437 に答える
1

私は最近、この問題をいじっていました。私の場合、内部にドットとスペースを含む変数がありました。実行しようとしたすべての組み合わせをリストします。

テスト 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
于 2016-10-19T15:20:36.427 に答える
1

この問題に対するいくつかのオプションは、Microsoft Connect サイトに提出されたこの問題の [回避策] タブにあります。そこにいる間、投票してください。

于 2010-09-17T13:37:32.853 に答える