2010-05-02 12 views
23

Sto cercando di passare un nome di tabella nel mio mysql stored procedure per utilizzare questo sproc per selezionare off di tabelle diverse, ma non sta funzionando ...utilizzare una variabile per il nome della tabella in mysql sproc

questo è ciò che I "sto cercando:

CREATE PROCEDURE `usp_SelectFromTables`(
IN TableName varchar(100) 
) 
BEGIN 
     SELECT * FROM @TableName; 
END 

ho anche provato w/o il simbolo @ e che appena mi dice che TableName non esiste ... che so :)

risposta

12

dipende il DBMS, ma la notazione di solito richiede Dynamic SQL, e si imbatte nel problema che i valori di ritorno dal f Untion dipende dagli input quando viene eseguito. Questo dà le connotazioni di sistema. Come regola generale (e quindi probabilmente soggetta a eccezioni), i DBMS non consentono di utilizzare segnaposti (parametri) per elementi strutturali di una query come nomi di tabelle o nomi di colonne; ti consentono solo di specificare valori come i valori delle colonne.

Alcuni DBMS hanno un supporto di stored procedure che consente di creare una stringa SQL e quindi di utilizzarla, utilizzando "prepara" o "esegui immediatamente" o operazioni simili. Si noti, tuttavia, che si è improvvisamente vulnerabili agli attacchi di SQL injection - qualcuno che può eseguire la procedura è quindi in grado di controllare, in parte, ciò che viene eseguito SQL.

44
SET @cname:='jello'; 
SET @vname:='dwb'; 
SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc'); 

PREPARE stmt FROM @sql_text; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

WOW, che brilla modo brillante! –

12

Un extra che mi ha causato problemi.

Ho voluto impostare dinamicamente il nome e il campo della tabella in una query come richiesto da @kyle, ma volevo anche memorizzare il risultato di tale query in una variabile @a all'interno della query.

Invece di inserire la variabile @a nello concat letteralmente, è necessario includerlo come parte del testo della stringa.

delimiter // 

CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT) 

BEGIN 
    SET @table_name = table_name; 
    SET @keyField = keyField; 
    SET @maxId = maxId; 
    SET @num_rows = num_rows; 

    SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name); 
    PREPARE stmt1 FROM @sql_text1; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 

    loop_label: LOOP 
    SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1'); 
    PREPARE stmt2 FROM @sql_text2; 
    EXECUTE stmt2; 
    DEALLOCATE PREPARE stmt2; 

    ...Additional looping code... 

    END LOOP; 
END 
// 

delimiter ; 

Così @sql_text1 assegnare il risultato della query @a all'interno della stringa utilizzando:

') INTO @a FROM '

Poi nel @sql_text2 uso @a come variabile reale:

,' WHERE ',@keyField,' >= ', @a ,' ORDER BY '

Problemi correlati