如何通过powershell使用SQL分隔符

时间:2012-05-31 17:37:52

标签: mysql database powershell delimiter

我试图读取一个由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

2 个答案:

答案 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语句就可以了。 (在这里对本地机器进行了测试。)