¿Es posible ejecutar una cadena en MySQL?
-
14-09-2019 - |
Pregunta
Tengo para convertir un procedimiento almacenado MSSQL que pasa un varchar
que es una consulta:
INSERT INTO Results
EXEC (@Expresion);
Esto no está funcionando. Estoy bastante seguro de que EXEC
y EXECUTE
no son comandos de MySQL, pero CALL
no funciona bien.
¿Alguien sabe si es aún posible tener algo así como la función de eval
JavaScript para MySQL?
Solución
EJECUTAR es un comando válido en MySQL. MySQL manual de referencia
Otros consejos
Creo que usted está buscando algo como esto:
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;
Este es el equivalente de SQL eval(my_string);
:
@Expression = 'SELECT "Hello, World!";';
PREPARE myquery FROM @Expression;
EXECUTE myquery;
Básicamente he combinado las respuestas existentes, ni le indica cómo hacer exactamente eval.
Si desea agregar parámetros, puede utilizar lo siguiente:
@username = "test";
@password = "asdf";
@Expression = 'SELECT id FROM Users WHERE name = ? AND pass = ?;'
PREPARE myquery FROM @Expression;
EXECUTE myquery USING @username, @password;
Y para responder a la pregunta original con exactitud:
@Expression = 'SELECT "Hello, World!";'
PREPARE myquery FROM @Expression;
INSERT INTO Results
EXECUTE myquery;
Tenga en cuenta que la declaración PREPARE ... FROM
quiere una variable de sesión (con el prefijo @
). Si intenta pasar una variable normal, se va a tirar sus manos en el aire y que no le importa.
El EXECUTE
comando de MySQL sólo se puede utilizar para una declaración preparada.
Si el caso de que desee ejecutar varias consultas de la cadena, considere la posibilidad de guardarlos en un archivo de fuente y que, por ejemplo.
SET @query = 'SELECT 1; SELECT 2; SELECT 3;';
SELECT @query INTO OUTFILE '/tmp/temp.sql';
SOURCE /tmp/temp.sql;