2009-05-14 17 views
7

Supponiamo che una stored procedure SetCustomerName abbia un parametro di input Name e che disponga di una tabella clienti con nome colonna. Quindi all'interno della mia stored procedure voglio impostare il nome del cliente. Se scrivoMySQL: quando il nome del parametro della procedura memorizzata è uguale al nome della colonna della tabella

UPDATE customers SET Name = Name;

questo non è corretto e vedo 2 altri modi:

UPDATE customers SET Name = `Name`; 
UPDATE customers SET customers.Name = Name;

Primo uno funziona, ma non ho trovato nella documentazione che posso avvolgere parametri all'interno `caratteri. O mi mancava nella documentazione (il link è apprezzato in questo caso).

Quali altri modi ci sono e qual è il modo standard per un caso del genere? Rinominare i parametri di input non mi fa bene (perché ho una mappatura relazionale oggettuale se sai cosa intendo).

UPDATE:

Quindi, c'è un link su apici inversi (http://dev.mysql.com/doc/refman/5.0/en/identifiers.html) ma non è spiegato abbastanza in profondità come usarli (come usarli con i parametri e nomi di colonna).

E c'è una cosa molto strana (almeno per me): È possibile utilizzare backticks in entrambi i casi:

UPDATE customers SET Name = `Name`; 
//or 
UPDATE customers SET `Name` = Name; 
//or even 
UPDATE customers SET `Name` = `Name`;

e tutti lavorare assolutamente allo stesso modo.

Non pensi che sia strano? Questo strano comportamento è spiegato da qualche parte?

risposta

4

Penso che il primo esempio è in realtà indietro. Se si sta cercando di impostare la colonna "Nome" al parametro di ingresso "Nome", credo che dovrebbe essere:

UPDATE customers SET `Name` = Name; 

E per il secondo esempio, è possibile impostare tabella alias stesso modo in cui si fa in tutte le altre dichiarazioni:

UPDATE customers AS c SET c.Name = Name; 
0

o usare qualcosa di simile:

BEGIN 
set @m_query = concat('update users set ',column,' = \'', value,'\' where id = ',user); 

prepare stmt from @m_query; 
execute stmt; 

END 

colonna & value sono TESTO utente sono INT

+1

** Non farlo! ** Vuoi veramente costruire l'SQL usando la concatenazione di stringhe? Che mi dici dell'iniezione SQL? – ADTC

+0

@ADTC, stai scherzando? Per poter eseguire questa stored procedure devi già essere nel sottosistema SQL. Quindi puoi eseguire quasi tutte le query che ti piacciono. PIÙ questa è una dichiarazione preparata. Uno dei principali vantaggi delle dichiarazioni preparate è che impediscono l'iniezione SQL. –

+0

Se si concatenano le stringhe per fare una dichiarazione, quindi "prepararla" (senza alcun parametro di sorta), non è una dichiarazione preparata, è solo un'affermazione che pretende di essere preparata. – ADTC

14

Il modo più semplice per distinguere tra il parametro e la colonna (se entrambi i nomi sono uguali) è aggiungere il nome della tabella nel nome della colonna.

UPDATE customers SET customers.Name = Name; 

addirittura si può anche aggiungere il prefisso del database come

UPDATE yourdb.customers SET yourdb.customers.Name = Name; 

Aggiungendo il nome del database è possibile eseguire un'azione su più di 1 database dalla procedura di memorizzazione singolo.

+1

Questo dovrebbe essere contrassegnato come la risposta, grazie. – ykh

Problemi correlati