【问题标题】:How to use a SQL Delimiter through powershell如何通过 powershell 使用 SQL 分隔符
【发布时间】:2023-03-17 13:40:02
【问题描述】:

我试图读入一个由 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_time_insert"

【问题讨论】:

  • 可以发一下SQL代码吗?另外,我认为 use 语句不会对第二次调用 ExecuteNonQuery 产生任何影响。
  • 抱歉我的无知,但是我怎么能把代码发给你呢?我快速搜索了一下,发现 SO 没有 PM 选项。我应该在这里简单地粘贴代码吗?
  • 对不起,我第一次误解了这个问题。我猜这个问题与两个系统之间的线路终结器有关。我的猜测是mysql正在选择“分隔符//创建触发器......”一行,导致语法错误。我不确定如何解决这个问题。

标签: mysql database powershell delimiter


【解决方案1】:

我意识到这是一个非常古老的主题,但我认为它是唯一涵盖此主题的主题。已回答的解决方案有效,但从 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 包。

现在可以从两个环境中执行相同的脚本文件。

【讨论】:

  • 感谢您提供更通用(虽然有点老套)的解决方案!
【解决方案2】:

Powershell 不支持 Delimiter 关键字,但在这种情况下实际上没有必要。

你的

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

block 将在没有分隔符的情况下工作,因为 Powershell 将整个命令视为单个项目,而不是 MySQL 命令行界面如何将其视为多行集。

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

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2019-11-03
    • 2012-12-01
    相关资源
    最近更新 更多