【问题标题】:mysql stored procedure parameters don't seem to work with "@" (At sign)mysql 存储过程参数似乎不适用于“@”(At 符号)
【发布时间】:2014-03-28 10:31:50
【问题描述】:

我正在将 MS SQL 数据库更改为 MySQL。

我重写了一个存储过程,它接受一个名为@Account_Number 的参数。当我在 MySQL 中运行存储过程时,我收到以下消息:Error Code: 1048 Column 'Account_Number' cannot be null

使用工作台,我终于修改并发现当我从存储过程中删除“@”并将它们重命名为 parmAccount_Number 时,存储过程将执行。

我真的想保持存储过程输入参数的名称相同,并且我不想回去重命名我的 MS SQL 参数......以防万一我想触发数据库。

我找不到关于 MySQL 对“@”做了什么的任何信息......

有没有办法让它与 "@" 一起工作?

编辑

声明存储过程

CREATE PROCEDURE `My_sp`(
 `@Account_Number` varchar(8),....)

插入sp部分

insert into 
My_Table
(
    Account_Number, ...
)
values
(
    @Account_Number,...
)

【问题讨论】:

  • 是否有机会发布一些代码,可能是之前和之后的代码,以便我们看看你有什么?
  • 希望有帮助...删掉其他字段,这样编辑就不会那么大...
  • 谢谢你 - 我相信 @spencer7593 已经为这个问题提供了适当的答案 (+1)。
  • @pStan:很有趣。我从未尝试过将过程变量或参数名称包含在反引号中,就像您在上面显示的那样。 (我只在 SQL 语句(表名、列名)中使用反引号作为标识符。鉴于您能够编译过程,您也可以尝试将参数引用包含在反引号中。据推测,MySQL 赢了'不将其视为用户定义的变量,实际上可能将其视为对参数名称的引用。(我还没有测试过。)

标签: c# mysql sql-server


【解决方案1】:

不,您不能命名以 @ 符号开头的 MySQL 过程变量。

@ 符号字符表示 MySQL 用户定义变量,它与过程变量完全不同。

最大的区别是用户定义的变量没有被声明(它们没有数据类型),并且它们在会话(数据库连接)中具有作用域,而不仅仅是一个过程。它持续整个会话。 (这也意味着它可以在会话中的任何地方进行修改,任何 SQL 语句、触发器、函数或过程都可以修改它,这使得它非常有用,也使它成为一个潜在的陷阱。

可以使用用户定义的变量作为传递给过程或函数的实际值。但是您不能命名以 @ 符号开头的 MySQL 过程变量或参数。

我相信这符合 SQL 2003 标准。

这里的文档:

http://dev.mysql.com/doc/refman/5.5/en/user-variables.html

更新

有趣。

假设您能够通过将参数名称包含在反引号中来编译过程(如您添加的示例语句中所示)...

您也可以尝试将 INSERT 语句中的参数名称引用包含在反引号中。 (我从未测试过;我以前从未尝试过“倒勾”变量名;我以前从未见过这样做过。)但是如果程序实际上正在编译,那么也许这会起作用。

【讨论】:

  • 感谢您的快速回答。不过,这有点令人遗憾。如果数据库类型是 mysql vs msSQL,也许我可以在我的 DAL 中添加一个包装器以将我的“@”更改为“p_”。这样我就可以不理会我的大部分代码,也不会更改我的 msSQL 存储存储过程。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多