在MySQL中执行字符串是否可行?

35

我需要将一个传递了一个查询的 varchar 的 MSSQL 存储过程进行转换:

INSERT INTO Results
  EXEC (@Expresion);

这行代码无法正常工作。我相当确定EXECEXECUTE不是MySQL的命令,但CALL也不起作用。

有人知道是否可以在MySQL中类似于JavaScript的eval函数吗?

4个回答

28

我认为你在寻找类似于这样的东西:

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;

5
这个SET @asd = NULL;的行是有意义的吗?我不明白这是在做什么。 - Jsilvermist

23

这是 SQL 中类似于 eval(my_string); 的语法:

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

基本上,我结合了现有的答案,但没有告诉你如何确切地执行eval。


如果你想添加参数,可以使用这个:

@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语句需要一个会话变量(以@为前缀)。如果您尝试传递普通变量,它将无能为力。


1
"@Expression = 'SELECT "Hello, World!";';" 对我不起作用。我正在使用MySQL v5.6.30。 - kenorb
@kenorb 奇怪,因为我确定这在最近的mysql版本上可以工作。可能与设置不同的分隔符有关吗?(我可能已经这样做了,但忘记了它会影响到这个。) - Luc
6
或许需要在之前加上 SET - kenorb
代码完美运行!它将把手举起来,毫不在意。 - Rahul Chawla

19

2

EXECUTE MySQL命令只能用于一个预处理语句。

如果您想要执行多个查询字符串,请考虑将它们保存到文件中并进行源码引用,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接