【问题标题】:how to pass table name into a function?如何将表名传递给函数?
【发布时间】:2011-09-20 13:32:19
【问题描述】:

有什么方法可以制作接收表名或字段名的MySQL函数吗?

类似这样的:

CREATE PROCEDURE delete_row(the_id INT UNSIGNED , @table_name )  
BEGIN  
    IF ....... THEN
    BEGIN
        DELETE FROM @table_name WHERE id = the_id ;
        .............
    END
END

我用字符串(SET @table_name="table_name")对其进行了测试,但它不起作用。

【问题讨论】:

  • 我找到了有用的答案here。通过这个答案,我创建了一个 SQL 语句字符串并执行该字符串。可能是 SQL 注入的严重问题。

标签: mysql sql


【解决方案1】:
declare varchar(max) @mySQL
set @mySQL = 'DELETE FROM ' + @tablename + 'WHERE id = ' + Convert(varchar, @the_id)
sp_executeSQL @mySQL

为了在 MySQL 上进行这项工作(正如评论者指出的那样),它应该如下所示:

mysql> prepare stmt from -> 'DELETE FROM ' + @tablename + 'WHERE id = ' + Convert(varchar, @the_id)
mysql> execute stmt; 

【讨论】:

  • 编辑:以上在 SQL Server 中工作。在 MySQL 中,我认为它看起来像 mysql> prepare stmt from -> 'DELETE FROM ' + @tablename + 'WHERE id = ' + Convert(varchar, @the_id) mysql> execute stmt;
  • 看起来很像 SQL Server :) Mitch,那么你的评论应该是你的答案。
  • 这个答案的总体思路很好(执行一个准备好的语句),但是没有一个代码可以远程在 MySQL 上运行。
  • 有关 MySQL 实现的更多信息,请参阅this post
  • 首先,语句需要终止,所以在每一行的末尾你应该有一个分号。然后,在 MySQL 中,你声明像DECLARE <varname> <vartype> 这样的变量,所以变量名和类型被切换了。 Varchar(max) 在 MySQL 中没有意义。 @ 前缀是为会话变量保留的,您不能“声明”。好吧,这就是第一行不起作用的地方。接下来的内容同样充满了不兼容的代码,但你明白了。不过,您使用准备好的语句的想法是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2019-10-11
相关资源
最近更新 更多