2012-05-31 8 views
3

我試圖讀取一個SQL文件,由powershell執行。一切正常,除了powershell由於分隔符引發錯誤。 所以我的問題是我將如何去在我的sql文件中使用分隔符(我只能對sql文件進行小的更改,其代碼必須保持相對不變),但通過PowerShell正確加載它。如何通過PowerShell使用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 ; 

異常調用 「的ExecuteNonQuery」 和 「0」 的說法(S):「你在你的SQL語法錯誤;檢查手冊,該手冊對應於您的MySQL服務器版本的正確語法使用附近'定界符// 創建觸發stop_time_insert插入停止後在第1行「

+0

你能發送SQL代碼嗎?另外,我不認爲這個使用語句會對第二次調用ExecuteNonQuery產生任何影響。 –

+0

對不起,我怎樣才能向你發送代碼?我做了一個快速搜索,發現SO沒有PM選項。我應該只在這裏粘貼代碼嗎? – G3TH

+0

對不起,我第一次誤解了這個問題。我猜想這個問題與兩個系統之間的線路終結器有關。我的猜測是,mysql正在拾取「分隔符//創建觸發器......」在一行上,導致語法錯誤。我不知道如何解決這個問題。 –

回答

1

Powe rshell不支持Delimiter關鍵字,但在這種情況下實際上並不需要。

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

塊將工作無定界符,因爲PowerShell將整個命令作爲單個項目,而不是MySQL命令行界面如何把它當作一個多集。

所以,只要刪除分隔符語句,你應該沒問題。 (在這裏測試本地機器。)

+0

非常感謝。此解決方案工作。 – G3TH

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 ; 

調用MySQL的距離Mike Shepard的MySQLLib包。

現在可以在兩種環境中執行相同的腳本文件。

+0

感謝更一般的(雖然有點哈克)解決方案! – ysalmi