2012-03-29 14 views
5

Sto impostando una variabile, quindi desidero utilizzare il comando per modificare il database. Sfortunatamente USE non valuta la variabile.Database di modifica MySQL con valore variabile

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' 

Quindi il valore della variabile non viene valutato quando provo a connettermi. Qualche idea?

+0

Penso che si desidera ": =" invece di "=" quando si usa SET – keyser

+0

E 'lo stesso se uso: = = o solo, il che significa usano ancora cerca di valutare la stringa @con – bioShark

+0

Yup. Appena trovato questo: "È anche possibile assegnare un valore a una variabile utente in istruzioni diverse da SET. In questo caso, l'operatore di assegnazione deve essere: = e non = perché quest'ultimo viene trattato come operatore di confronto = in istruzioni non SET : ". Mi dispiace, ma non posso aiutare. – keyser

risposta

5

Ho trovato la mia soluzione, quindi risponderò alla mia domanda, nel caso qualcuno sia interessato.

@outis hai ragione, non è possibile utilizzare una variabile con il comando USE.

Tuttavia, a causa del fatto che voglio creare una tabella in un database specificato in fase di esecuzione, la mia soluzione sarebbe quella di utilizzare SQL dinamico:

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; 

Quindi, in pratica questa soluzione costruisce la dichiarazione, si prepara e lo esegue Il parametro @schema può anche essere passato allo script. In questo modo creo dinamicamente l'istruzione create.

+0

Ricordarsi di contrassegnarlo come accettato anche. – keyser

+0

Dice che ho bisogno di aspettare 2 giorni per accettarlo ... – bioShark

+0

Sarebbe bello "deallocare il comando di preparazione". – MyGGaN

0

Non penso sia possibile in alcun modo USE @var;. Ma in alcuni casi farlo nel modo contrario potrebbe essere un'opzione.

USE testDB; 
SET @schema = DATABASE(); 
Problemi correlati