1

動的 SQL と concat メソッドを使用せずに、SQL クエリで変数を使用するにはどうすればよいですか?

スクリプトの開始時に変数を宣言して、スクリプト全体でそれらを使用できるようにしたいと思います (テーブル名など)。

これが私がやりたいことの例です:

declare variables
Set @Table1 = 'WhatsOn_20141208'

-- drop and re-create table
drop table if exists @Table1;
CREATE TABLE @Table1 (
rac_account_no  varchar(100),
addressLine2    varchar(100)
);

-- load data into table
LOAD DATA LOCAL INFILE 'C:/Example.txt' 
INTO TABLE @Table1
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES;

-- update addressLine2 column
Update @Table1
set addressLine2 = REPLACE(addressLine2,"*UNKNOWN*","");

テーブル名が変更された場合、すべての出現箇所を検索して置換するのではなく、変数で一度変更できるようにしたいと考えています。

これまでに見つけた唯一の解決策は、動的 SQL を使用して、次の例のように文字列を連結することです。

SET @s = CONCAT('select * from ', @Cat, ' where ID = ', @ID_1); 

PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

もっと簡単な方法はありますか?

乾杯、ルーカス

4

1 に答える 1

1

動的 SQL と concat メソッドを使用せずに、SQL クエリで変数を使用するにはどうすればよいですか?

申し訳ありませんが、できません。動的 SQL は、MySQL で行われている方法です。

これは、値ではなく、スキーマ、テーブル、および列の名前 (つまり、データ ディクショナリ名) に適用されます。

データ ディクショナリ アイテムの変数名を必要とするほとんどのアプリケーション開発者は、ホスト言語でクエリを作成します。つまり、php や Java などを使用して文字列を次のように変換します。

 SELECT xxx FROM yyy WHERE zzz

のような文字列に

 SELECT id,name,value FROM transaction WHERE id=?

次に、データ値にバインド変数を使用します。

MySQL の準備済みステートメントは、ホスト言語ではなく、MySQL サーバー内でそのような作業を行う方法にすぎません。しかし、(私の意見では) プリペアド ステートメントは単体テストやトラブルシューティングが難しいため、ホスト言語を使用する方が効率的なソフトウェア エンジニアリングになります。

アプリケーションのデータ ソースが信頼されていない場合は少し危険なので、すべての入力の有効性を確認することが重要です。

于 2014-12-11T02:15:30.403 に答える