2009-05-14 9 views
7

Supposons que nous ayons une procédure stockée SetCustomerName qui a un paramètre d'entrée Name et que j'ai une table clients avec le nom de la colonne. Donc, dans ma procédure stockée, je veux définir le nom du client. Si j'écrisMySQL: Lorsque le nom du paramètre de la procédure stockée est identique au nom de la colonne du tableau

UPDATE customers SET Name = Name;

ce qui est faux et je vois 2 autres façons:

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

D'abord on travaille, mais je ne trouve pas dans la documentation que je peux envelopper les paramètres à l'intérieur `caractères. Ou l'ai-je manqué dans la documentation (lien apprécié dans ce cas).

De quelles autres façons y at-il et quel est le moyen standard pour un tel cas? Renommer le paramètre d'entrée n'est pas bon pour moi (parce que j'ai un mappage objet-relationnel automatique si vous savez ce que je veux dire).

MISE À JOUR:

Donc, il y a un lien à propos de (http://dev.mysql.com/doc/refman/5.0/en/identifiers.html) des accents graves mais il n'expliqué assez profond comment les utiliser (comment les utiliser avec les paramètres et les noms de colonnes).

Et il y a une chose très étrange (au moins pour moi): Vous pouvez utiliser des accents graves de toute façon:

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

et ils travaillent tous absolument de la même manière.

Ne trouvez-vous pas cela étrange? Est-ce que ce comportement étrange est expliqué quelque part?

Répondre

4

Je pense que votre premier exemple est en fait en arrière. Si vous essayez de définir la colonne « Nom » au paramètre d'entrée « Nom », je crois qu'il devrait être:

UPDATE customers SET `Name` = Name; 

Et pour le second exemple, vous pouvez définir des alias de tables de la même façon que vous faites dans toutes les autres déclarations:

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

ou utiliser quelque chose comme ça:

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

prepare stmt from @m_query; 
execute stmt; 

END 

colonne valeur & sont TEXT utilisateur sont INT

+1

** Ne faites pas ça! ** Voulez-vous vraiment construire le SQL en utilisant la concaténation de chaînes? Qu'en est-il de l'injection SQL? – ADTC

+0

@ADTC, vous plaisantez? Pour exécuter cette procédure stockée, vous devez déjà être dans le sous-système SQL. Par conséquent, vous pouvez exécuter à peu près n'importe quelle requête que vous aimez. PLUS c'est une déclaration préparée. L'un des principaux avantages des instructions préparées est qu'elles empêchent l'injection SQL. –

+0

Si vous enchaînez des chaînes pour faire une déclaration, alors "préparez-la" (sans aucun paramètre), ce n'est pas une déclaration préparée, c'est juste une déclaration prétendant être préparée. – ADTC

14

Le moyen le plus simple de faire la distinction entre votre paramètre et votre colonne (si les deux noms sont identiques) est d'ajouter un nom de table dans votre nom de colonne.

UPDATE customers SET customers.Name = Name; 

Même vous pouvez également ajouter le préfixe de base de données comme

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

En ajoutant le nom de la base de données, vous pouvez effectuer une action sur la base de données plus de 1 de la procédure de magasin unique.

+1

Cela devrait être marqué comme la réponse, Merci. – ykh

Questions connexes