エラーコード:1054。「where句」の不明な列「SPA」
これは、入力文字列を引用符で囲まず、SQLエンジンがそれをクエリ対象のテーブルの列として識別しようとした場合に発生します。しかし、それが見つからないため失敗します。
しかし、そのような列が見つかるとどうなりますか?
列の値に一致するものが見つかると、結果がフェッチされます。
明らかに、これは期待したものではありません。
これを克服する方法は?動的入力値でプリペアドステートメントを使用します。
?
のようなプレースホルダーを使用できます Prepared Statements
で使用する動的入力値のストアドプロシージャでも 。エンジンは、SQL式に割り当てられたとき、またはSQL式内で比較されたときに、エスケープ文字やその他の文字列値を処理します。
必要に応じて、プロシージャ入力を1つ以上のセッション変数に再割り当てする必要があります。
手順の例 :
CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
SET @w_team := w_team;
PREPARE stmt3 FROM @t1;
EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
DEALLOCATE PREPARE stmt3;
END;