2010-06-04 3 views
17

Par exemple, cela ne fonctionne pas:Dans MySQL: Comment passer un nom de table en tant que procédure stockée et/ou argument de fonction?

DELIMITER // 
CREATE PROCEDURE countRows(tbl_name VARCHAR(40)) 
    BEGIN 
    SELECT COUNT(*) as ct FROM tbl_name; 
    END // 

DELIMITER ; 
CALL countRows('my_table_name'); 

Produit:

ERROR 1146 (42S02): Table 'test.tbl_name' doesn't exist 

Cependant, cela fonctionne comme prévu:

SELECT COUNT(*) as ct FROM my_table_name; 

Quelle syntaxe est nécessaire d'utiliser un argument comme nom de la table dans une instruction select? Est-ce seulement possible?

+1

Même si cela était possible, ce n'est pas un chemin que vous devriez descendre. Soit construire le s'procs avec le sql que vous voulez vraiment, ou tout simplement aller de l'avant et intégrer le sql ad hoc dans votre code. – NotMe

+3

@Chris Vous pouvez voir l'intention et la puissance ici, non? Passer un nom de table à une fonction générique. Je le vois comme parfaitement légitime et nécessaire. Aidez-moi à comprendre pourquoi il est mauvais de contrôler un ensemble de résultats d'un sproc? De ce que vous dites, si j'ai un développeur .NET et un développeur PHP, je devrais leur demander d'écrire leur propre code pour obtenir le même ensemble de résultats? –

+0

Je vois l'intention, et c'est défectueux. Je vous suggère fortement de lire ce qui suit: http://www.sommarskog.se/dynamic_sql.html Bien qu'il couvre MS SQL Server, les leçons sont les mêmes. – NotMe

Répondre

24

Prepared statements sont ce dont vous avez besoin.

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT('SELECT * FROM ',tab_name); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END $$ 
+0

+1: Vous étiez en premier, & correct - vous devez utiliser Prepared Statements (SQL dynamique de MySQL): http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html –

+0

rawesome. Merci un million. –

+2

'CALL GetNumRows (gps_location)' Renvoie: '# 1054 - Colonne inconnue 'gps_location' dans 'liste de champs'' – Pachonk

Questions connexes