2012-03-29 10 views
5

Estoy estableciendo una variable, y luego quiero usar el comando USE para cambiar la base de datos. Desafortunadamente USE no evalúa la variable.base de datos de cambios MySQL con valor de variable

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' 

Así que el valor de la variable no se evalúa cuando intento conectar. ¿Algunas ideas?

+0

Creo que quieres ": =" en lugar de "=" cuando se utiliza SET – keyser

+0

Es lo mismo si uso: = o =, lo que significa USO todavía trata de evaluar la cadena @con – bioShark

+0

Sip. Acabo de encontrar esto: "También puede asignar un valor a una variable de usuario en sentencias distintas de SET. En este caso, el operador de asignación debe ser: = y no = porque este último se trata como el operador de comparación = en sentencias no establecidas : ". Lo siento, no puedo evitarlo. – keyser

Respuesta

5

He encontrado mi propia solución, por lo que voy a responder mi propia pregunta, en caso de que alguien esté interesado.

@outis tiene razón, no es posible usar una variable con el comando USE.

Sin embargo, debido al hecho de que quiero crear una tabla en una base de datos especificada en tiempo de ejecución, mi solución sería utilizar SQL dinámico:

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; 

Así que, básicamente, esta solución se acumula la declaración, se prepara y lo ejecuta. @schema parámetro puede incluso ser pasado a la secuencia de comandos. De esta forma construyo dinámicamente la declaración de creación.

+0

Recuerde marcarlo como aceptado también. – keyser

+0

Dice que necesito esperar 2 días para aceptarlo ..... – bioShark

+0

Sería bueno 'desasignar el comando de preparación;' también. – MyGGaN

0

No creo que sea posible USE @var; de alguna manera. Pero en algunos casos hacerlo al revés podría ser una opción.

USE testDB; 
SET @schema = DATABASE(); 
Cuestiones relacionadas