我试图读取一个由PowerShell执行的sql文件。一切正常,但powershell因单词分隔符引发错误。 所以我的问题是如何在我的sql文件中使用分隔符(我只能对sql文件进行微小的更改,它的代码必须保持相对不变),但是通过powershell正确加载它。
继承我的代码来自两个文件和我得到的错误。提前谢谢。
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附近使用正确的语法// 在插入第1行“
上的stop'后创建触发器stop_time_insert答案 0 :(得分: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包。
现在可以从两个环境执行相同的脚本文件。
答案 1 :(得分:1)
Powershell不支持Delimiter关键字,但在这种情况下实际上并不是必需的。
你的
create trigger stop_time_insert after insert on stops
begin
//do stuff
end;
块将在没有分隔符的情况下工作,因为Powershell将整个命令视为单个项目,而不是MySQL命令行界面如何将其视为多行集合。
所以只需删除Delimiter语句就可以了。 (在这里对本地机器进行了测试。)