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 // 插入后创建触发器 stop_time_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 将整个命令视为单个项目,而不是 MySQL 命令行界面如何将其视为多行集。

因此,只需删除 Delimiter 语句就可以了。(在此处针对本地计算机进行了测试。)

于 2012-05-31T19:05:50.397 回答