2009-06-16 12 views
18

je dois convertir un MSSQL proc stocké qui passe un varchar qui est une requête:Est-il possible d'exécuter une chaîne dans MySQL?

INSERT INTO Results 
    EXEC (@Expresion); 

Ce ne fonctionne pas. Je suis assez sûr que EXEC et EXECUTE ne sont pas des commandes MySQL, mais CALL ne fonctionne pas non plus.

Est-ce que quelqu'un sait s'il est même possible d'avoir quelque chose comme la fonction eval de JavaScript pour MySQL?

Répondre

13

Je pense que vous cherchez quelque chose comme ceci:

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; 
+1

Qu'est-ce que '@ ads' dans votre dernière commande? –

6

Ceci est l'équivalent SQL de eval(my_string);:

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

Fondamentalement, je combine les réponses existantes, ni vous dit comment faire exactement l'évaluation.


Si vous voulez ajouter des paramètres, vous pouvez utiliser ceci:

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

Et pour répondre à la question initiale exactement:

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

Notez que l'instruction PREPARE ... FROM veut une variable de session (préfixé par @). Si vous essayez de passer une variable normale, il lèvera les mains en l'air et cela ne vous dérangera pas.

+0

'@Expression = 'SELECT" Bonjour, monde! ";';' Ne fonctionne pas pour moi. J'utilise MySQL v5.6.30. – kenorb

+0

@kenorb Étrange car je suis certain que cela a fonctionné sur une version récente de mysql. Cela peut-il avoir quelque chose à voir avec la définition d'un délimiteur différent? (J'ai peut-être fait cela mais j'ai oublié que cela affectait cela.) – Luc

+3

Peut-être que SET est nécessaire avant. – kenorb

1

La commande MySQL EXECUTE ne peut être utilisée que pour une instruction préparée.

Si vous souhaitez exécuter plusieurs requêtes à partir de la chaîne, envisagez de les enregistrer dans le fichier et de l'importer, par ex.

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