2012-03-29 2 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

Я думаю, что вы хотите «: =» вместо «=» при использовании SET – keyser

+0

Это то же самое, если я использую: = или просто =, то есть ЕГЭ еще пытается оценить строку @con – bioShark

+0

Угу. Просто нашел это: «Вы также можете присвоить значение переменной пользователя в операторах, отличных от 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

Было бы неплохо «освободить команду подготовки», а также. – MyGGaN

0

Я не думаю, что это возможно USE @var; в некотором роде. Но в некоторых случаях это может быть наоборот.

USE testDB; 
SET @schema = DATABASE(); 
Смежные вопросы