2012-03-29 5 views
5

変数を設定するときに、USEコマンドを使用してデータベースを変更したいとします。残念ながらUSEは変数を評価しません。MySQLで可変値のデータベースを変更する

SET @con="testDB"; 
Query OK, 0 rows affected (0.00 sec) 
select @con; 
+--------+ 
| @con | 
+--------+ 
| testDB | 
+--------+ 
1 row in set (0.00 sec) 
use @con; 
ERROR 1049 (42000): Unknown database '@con' 

したがって、接続しようとすると変数の値は評価されません。何か案は?

+0

私は、あなたがしたいと思う「:=」は代わりのセットを使用しているとき、私が使用している場合は「=」 – keyser

+0

それは同じです:=またはちょうど=、使用することを意味することは、まだ – bioShark

+0

うん@con文字列を評価しようとします。 SET以外のステートメントでユーザー変数に値を代入することもできます。この場合、代入演算子は:=とnot =でなければなりません。後者は非SETステートメントの比較演算子として扱われるからです: "申し訳ありませんが、私は助けることはできません。試みるために – keyser

答えて

5

私自身の解決策を見つけたので、誰かが興味を持っている場合は、自分の質問に答えるつもりです。

@outisあなたは正しいので、コマンドUSEで変数を使用することはできません。

しかし、私は、実行時に指定したデータベース内のテーブルを作成したいという事実のため、私の解決策は、動的SQLを使用することです:

set @schema="testDB"; 
set @front="CREATE TABLE IF NOT EXISTS "; 
set @endpart=".`TEST1` (DIM_ID INT(16)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;"; 
set @stat=concat(@front,@schema,@endpart); 
prepare command from @stat; 
execute command; 

だから基本的にこのソリューションは声明を構築し、準備それを実行します。 @schemaパラメータは、スクリプトの前にあってもかまいません。このようにして、私は動的にcreate文を構築します。

+0

それも受け入れられたとマークすることを忘れないでください。 – keyser

+0

それは私がそれを受け入れるために2日待つ必要があると言います..... – bioShark

+0

'deallocate prepare command; 'にもいいですね。 – MyGGaN

0

USE @var;は何とかできません。しかし、いくつかのケースでそれを行うことは、別の方法の周りのオプションかもしれません。

USE testDB; 
SET @schema = DATABASE(); 
関連する問題