5

設定:

CREATE TABLE MyTest (TestCol1 nchar(5))

テスト:

次の作業:

Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$5')"
Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('(5')"

以下のエラーで失敗します。

Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$(5')"
Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$`(5')"

エラー: Invoke-Sqlcmd : At line:1 char:1 + Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -Ou ... + ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:) [Invoke-Sqlcmd], ParserException + FullyQualifiedErrorId : ExecutionFailureException,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

いくつかの調査の後、 $( は powershell で機能を提供するため、予約されていることがわかりました。ただし、括弧をエスケープしようとしましたが、成功しませんでした。代替案を見つけようとしました。これを行う方法についてのアイデアはありますか? SQL で CHAR 関数を使用する場合サーバーは動作しますが、私のコードで処理するのは面倒です. ありがとう.

4

5 に答える 5

5

-DisableVariablesを追加して、invoke-Sqlcmd の変数ルックアップを無効にするだけです。 $()SQLステートメントに変数を渡すために使用されます。

Invoke-Sqlcmd -InputFile $fileName -ServerInstance $serverInstance -DisableVariables

ソースhttp://msdn.microsoft.com/en-us/library/cc281720.aspx

于 2014-12-02T15:59:44.077 に答える
0

これを試して:

'INSERT INTO MyTest VALUES ("$(5")'

またはこれ:

'INSERT INTO MyTest VALUES (''$(5'')'
于 2013-03-22T21:27:43.647 に答える
0

$(anyvalue) は、SQLCMD.EXE で使用される予約変数です。シンボル $ を SQL サーバー CHAR(36) で変更します。

Invoke-Sqlcmd -データベース "データベース名" -ServerInstance "ホスト名" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES (CHAR(36)+'(5)')"

于 2014-03-14T19:04:57.213 に答える
-1

この問題は、$( は Powershell の予約語であるため、この作業を行うために CHAR 関数を使用して $ (CHAR(36)) を格納していたようです。これを実行すると、機能しましたが、このプロジェクトでは Invoke の使用を断念しました。 -SqlCmd コマンドを実行し、標準の ADO.NET メソッドを使用しました. Invoke-SqlCmd はコマンドを解析したいようで、予約済みの組み合わせについては、文字をエスケープしても予約語が引き続き表示されます.

于 2013-07-01T03:26:47.010 に答える
-2
"INSERT INTO MyTest VALUES ('`$5')"

文字列を出力します

INSERT INTO MyTest VALUES ('$5')

"INSERT INTO MyTest VALUES ('(5')"

文字列を出力します

INSERT INTO MyTest VALUES ('(5')

"INSERT INTO MyTest VALUES ('`$(5')"

文字列を出力します

INSERT INTO MyTest VALUES ('$(5')

"INSERT INTO MyTest VALUES ('`$`(5')"

文字列を出力します

INSERT INTO MyTest VALUES ('$(5')

何を挿入しますか? 実際には '$5' なのか、それとも変数 $5 の値なのか? また、変数 $5 を奇妙な括弧で囲んでいます。そのようなことが想定されているのか、それとも PowerShell 変数の別の重要な部分を理解していないのかわからない? これは文字列内の変数でもあるため"There are $((Get-Process).Count) processes running"です。

于 2013-03-22T22:42:50.570 に答える