36

I have to convert a MSSQL stored proc that passes a varchar that is a query:

INSERT INTO Results
  EXEC (@Expresion);

This isn't working. I'm pretty sure that EXEC and EXECUTE aren't MySQL commands, but CALL doesn't work either.

Does anyone know if it's even possible to have something like JavaScript's eval function for MySQL?

4 Answers 4

28

I think you're looking for something like this:

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;
Sign up to request clarification or add additional context in comments.

1 Comment

Is there any purpose to the SET @asd = NULL; line? I don't understand what this is doing.
23

This is the SQL equivalent of eval(my_string);:

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

Basically I combined the existing answers, neither tells you how to do eval exactly.


If you want to add parameters, you can use this:

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

And to answer the original question exactly:

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

Note that the PREPARE ... FROM statement wants a session variable (prefixed with @). If you try to pass a normal variable, it will throw its hands up in the air and it just won't care.

5 Comments

@Expression = 'SELECT "Hello, World!";'; doesn't work for me. I'm using MySQL v5.6.30.
@kenorb Strange because I'm certain this worked on a recent mysql version. Might it have something to do with setting a different delimiter? (I might have done that but forgotten that it affected this.)
Maybe SET is needed before.
+1 for the rhyme! it will throw its hands up in the air and it just won't care Code works perfectly!
At MySQL 8.0 I am unable to create a procedure containing INSERT INTO ..... EXECUTE ..... . Not a big issue for me - I have moved INSERT INTO stuff into my expression. I am just curious why it happens while the code worked fine for others.
19

EXECUTE is a valid command in MySQL. MySQL reference manual

Comments

3

The EXECUTE MySQL command can only be used for one prepared statement.

If case you want to execute multiple queries from the string, consider saving them into file and source it, e.g.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.