3

PowerShellによって実行されるSQLファイルを読み込もうとしています。区切り文字が原因でpowershellがエラーをスローすることを除いて、すべて正常に機能します。したがって、私の質問は、SQLファイルで区切り記号を使用する方法です(SQLファイルに小さな変更を加えるだけで、コードは比較的変更しないでください)が、powershellを介して正しくロードします。

両方のファイルからのコードとエラーが表示されます。前もって感謝します。

パワーシェル:

$sql = (Get-Content $pwd\NewClient.sql) | Out-String
$cmd.CommandText = "USE $dbname"
$cmd.ExecuteNonQuery()
$cmd.CommandText = $sql
$cmd.ExecuteNonQuery()

SQL:

delimiter //
......
end;//
delimiter ;

"0" 引数で "ExecuteNonQuery" を呼び出す例外: "SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。'Delimiter // create trigger stop_time_insert after insert 1号線で停車します」

4

2 に答える 2

4

これは非常に古いスレッドだと思いますが、このトピックを扱っているのはこれだけだと思います。回答されたソリューションは機能しますが、MySQL コマンド プロンプトから実行する場合、同じスクリプトを使用することはできません。次のように PS 関数を作成しました。

function executeScript([MySql.Data.MySqlClient.MySqlConnection]$conn, [String]$filePath)
{
    $fileName = Split-Path $filePath -Leaf
    Write-Host "Executing $fileName script"
    $sqlText = Get-Content $filePath | Out-String
    $sqlText = $sqlText.Replace("DELIMITER","-- DELIMITER")
    $sqlText = $sqlText.Replace('$$',";")
    return Invoke-MySql -sql $sqlText -connection $conn | Out-Null
}

次のような SQL スクリプトを想定します。

DELIMITER $$
....
END $$
DELIMITER ;

Invoke-MySql は、Mike Shepard の MySQLLib パッケージからのものです。

これで、両方の環境から同じスクリプト ファイルを実行できるようになりました。

于 2015-05-01T13:39:08.153 に答える
1

Powershell は Delimiter キーワードをサポートしていませんが、この場合は実際には必要ありません。

君の

create trigger stop_time_insert after insert on stops 
begin
   //do stuff
end; 

ブロックはデリミタなしで機能します。これは、Powershell がコマンド全体を 1 つの項目として扱うためであり、MySQL コマンド ライン インターフェイスがコマンドを複数行セットとして扱う方法ではありません。

したがって、Delimiter ステートメントを削除するだけで問題ありません。(ここでローカル マシンに対してテストされています。)

于 2012-05-31T19:05:50.397 に答える