【问题标题】:Is it possible to execute a string in MySQL?是否可以在 MySQL 中执行字符串?
【发布时间】:2010-11-03 04:58:48
【问题描述】:

我必须转换一个传递 varchar 的 MSSQL 存储过程,这是一个查询:

INSERT INTO Results
  EXEC (@Expresion);

这行不通。我很确定 EXECEXECUTE 不是 MySQL 命令,但 CALL 也不起作用。

有谁知道是否有可能为 MySQL 提供类似 JavaScript 的 eval 函数?

【问题讨论】:

    标签: mysql eval evaluation exec execute


    【解决方案1】:

    我认为您正在寻找这样的东西:

    SET @queryString = (
    SELECT CONCAT('INSERT INTO user_group (`group_id`,`user_id`) VALUES ', www.vals) as res FROM (
        SELECT GROUP_CONCAT(qwe.asd SEPARATOR ',') as vals FROM ( 
               SELECT CONCAT('(59,', user_id, ')') as asd FROM access WHERE residency = 9 
        ) as qwe 
    ) as www
    );
    
    PREPARE stmt FROM @queryString;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt; 
    SET @asd = NULL;
    

    【讨论】:

    • SET @asd = NULL; 行有什么用吗?我不明白这是在做什么。
    【解决方案2】:

    这是 eval(my_string); 的 SQL 等价物:

    @Expression = 'SELECT "Hello, World!";';
    PREPARE myquery FROM @Expression;
    EXECUTE myquery;
    

    基本上我结合了现有的答案,都没有告诉你如何准确地进行评估。


    如果要添加参数,可以这样:

    @username = "test";
    @password = "asdf";
    @Expression = 'SELECT id FROM Users WHERE name = ? AND pass = ?;'
    PREPARE myquery FROM @Expression;
    EXECUTE myquery USING @username, @password;
    

    并准确回答原始问题:

    @Expression = 'SELECT "Hello, World!";'
    PREPARE myquery FROM @Expression;
    INSERT INTO Results
      EXECUTE myquery;
    

    注意PREPARE ... FROM 语句需要一个会话变量(以@ 为前缀)。如果你试图传递一个普通的变量,它会举起手来,它根本不在乎。

    【讨论】:

    • @Expression = 'SELECT "Hello, World!";'; 对我不起作用。我正在使用 MySQL v5.6.30。
    • @kenorb 奇怪,因为我确信这适用于最近的 mysql 版本。可能与设置不同的分隔符有关吗? (我可能已经这样做了,但忘记了它影响了这一点。)
    • 之前可能需要SET
    • 押韵+1! 它会举起双手,它根本不在乎代码完美运行!
    【解决方案3】:

    EXECUTE 是 MySQL 中的有效命令。 MySQL reference manual

    【讨论】:

      【解决方案4】:

      EXECUTE MySQL 命令只能用于一个准备好的语句。

      如果您想从字符串中执行多个查询,请考虑将它们保存到文件中并获取它,例如

      SET @query = 'SELECT 1; SELECT 2; SELECT 3;';
      SELECT @query INTO OUTFILE '/tmp/temp.sql';
      SOURCE /tmp/temp.sql;
      

      【讨论】:

        猜你喜欢
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 2013-12-07
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多