2009-03-31 23 views
18

¿Hay alguna forma en MySQL de poner el nombre de la base de datos en una variable? Por ejemplo, cuando tengo una base de datos denominada 'db1', ¿puedo hacer algo como esto:nombre de la base de datos variable

set @db= 'db1'; 
select * from @db.mytable; 

EDIT: Hay otro ejemplo de lo que quiero hacer:

set @dbfrom= 'db1'; 
set @dbto= 'db2'; 
insert into @dbto.mytable (col1,col2,col3) select col2,col1,col3 from @dbfrom.mytable; 
+0

¿Algún idioma o entorno de programación en particular? La conexión con la base de datos es donde esto se especifica. –

+0

es solo mysql ... lo enviaré a myadmin – grilix

+2

¿Podría usar una declaración de uso http://dev.mysql.com/doc/refman/5.0/en/use.html? –

Respuesta

19

Con una considerable esfuerzo, sí.

SET @db = 'db1'; 
SET @q = CONCAT('SELECT * FROM ', @db, '.mycol'); 
PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

ya ... funciona, pero tengo muchas consultas de gran tamaño ... :( – grilix

+0

Lo siento. Eso es tan bueno como se pone – chaos

+0

¿Puedo hacer inserciones con este ? – grilix

1

Usando Chaos' 'Prepare Statement' solution I conseguido crear un procedimiento almacenado que utiliza un nombre de base de datos variable.

Funciona como un amuleto para migrar datos de una base de datos a otra con un Procedimiento almacenado. De esta forma, el código no está anclado a una única base de datos.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `SampleProcedure` $$ 
CREATE PROCEDURE `SampleProcedure`(IN HubDatabaseName VARCHAR(255)) 
BEGIN 

SET @db = HubDatabaseName; 
SET @q = CONCAT(' 

/* Import data from Hub database to local database */ 
INSERT INTO `table_name_in_local_database` 
SELECT 
    * 
FROM 
    ', @db ,'.`tablename` 

'); 

PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END $$ 
DELIMITER ; 
Cuestiones relacionadas