Powiedzmy, że mamy procedurę składowaną SetCustomerName, która ma parametr wejściowy Nazwa i mam klientów tabeli z nazwą kolumny. Więc wewnątrz mojej procedury przechowywanej chcę ustawić nazwę klienta. Jeśli piszęMySQL: Gdy nazwa parametru procedury składowanej jest taka sama, jak nazwa kolumny tabeli
UPDATE customers SET Name = Name;
to jest błędne i widzę 2 inne sposoby:
UPDATE customers SET Name = `Name`;
UPDATE customers SET customers.Name = Name;
Pierwszy z nich działa, ale nie mogę znaleźć w dokumentacji, że mogę owinąć parametrów wewnątrz `znaków. A może brakowało mi go w dokumentacji (link jest w tym przypadku mile widziany).
Jakie są inne sposoby i jaki jest standardowy sposób postępowania w takim przypadku? Zmiana nazwy parametru wejściowego nie jest dla mnie dobra (ponieważ mam automatyczne mapowanie obiektowo-relacyjne, jeśli wiesz, co mam na myśli).
UPDATE:
Tak, istnieje związek o backticks (http://dev.mysql.com/doc/refman/5.0/en/identifiers.html), ale to nie wyjaśnia dostatecznie głęboko, jak z nich korzystać (jak z nich korzystać z parametrów i nazwy kolumn).
I jest bardzo dziwne rzeczy (przynajmniej dla mnie): Można użyć backticks obu kierunkach:
UPDATE customers SET Name = `Name`;
//or
UPDATE customers SET `Name` = Name;
//or even
UPDATE customers SET `Name` = `Name`;
i wszystkie one działają absolutnie tak samo.
Nie uważasz, że to dziwne? Czy to dziwne zachowanie zostało wyjaśnione?
** Nie rób tego! ** Czy na prawdę chcesz skonstruować SQL używając konkatenacji ciągów znaków? A co z iniekcją SQL? – ADTC
@ADTC, żartujesz? Aby uruchomić tę procedurę przechowywaną, musisz już być w podsystemie SQL. Dlatego możesz uruchomić dowolne zapytanie. PLUS to jest przygotowane oświadczenie. Jedną z głównych zalet przygotowanych instrukcji jest to, że zapobiegają iniekcji SQL. –
Jeśli łączysz łańcuchy, aby utworzyć wyciąg, "przygotuj" go (bez żadnych parametrów), to nie jest przygotowana instrukcja, to tylko instrukcja udająca przygotowanie. – ADTC