Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Recorrer varias bases de datos de una instancia

Estas en el tema de Recorrer varias bases de datos de una instancia en el foro de SQL Server en Foros del Web. Les cuento mi problema: No tengo mucha experiencia con SQL y quiera saber si es posible ejecutar consulta a varias bases de datos en un ...
  #1 (permalink)  
Antiguo 13/06/2013, 14:01
 
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Recorrer varias bases de datos de una instancia

Les cuento mi problema:
No tengo mucha experiencia con SQL y quiera saber si es posible ejecutar consulta a varias bases de datos en un solo script, les muestro mi script
Código SQL:
Ver original
  1. USE master
  2. GO
  3. IF OBJECT_ID ('CREA_ARRAY_TMP', 'P') IS NOT NULL
  4.  DROP PROCEDURE CREA_ARRAY_TMP
  5. GO
  6. IF EXISTS (
  7.  SELECT *
  8.  FROM SYS.TABLES P
  9.  WHERE P.NAME = 'PAPELERA'
  10. )
  11. DROP TABLE Papelera
  12. GO
  13. CREATE PROCEDURE CREA_ARRAY_TMP
  14.  AS
  15.  SELECT NAME INTO PAPELERA
  16.  FROM sys.DATABASES
  17.  WHERE NAME LIKE 'DATA%'
  18. GO
  19. CREA_ARRAY_TMP
  20.  
  21. IF OBJECT_ID ('ACTUALIZA_BD', 'P') IS NOT NULL
  22.  DROP PROCEDURE ACTUALIZA_BD
  23. GO
  24. CREATE PROCEDURE ACTUALIZA_BD
  25.   AS
  26.   DECLARE @VARIABLE NVARCHAR(256),
  27.   @DATA CHAR(7),
  28.   @ROW CHAR(6)
  29.  
  30.   SET @ROW = (SELECT COUNT(*) FROM PAPELERA)
  31.   WHILE @ROW > 0
  32.     BEGIN
  33.      SET @DATA =  (SELECT TOP 1 NAME FROM PAPELERA)
  34.      SET @VARIABLE = 'USE ' + @DATA
  35.      EXECUTE(@VARIABLE)
  36.      --Aui ponemos el codigo a actualizar en todas las bases de datos
  37.         --ALTER TABLE COA
  38.         --ALTER column DIRECCION varchar(150);
  39.      --Hasta aqui
  40.      SET @VARIABLE = 'USE master'
  41.      EXECUTE(@VARIABLE)
  42.      SET @ROW=@ROW-1
  43.      DELETE FROM PAPELERA WHERE NAME = @DATA
  44.      
  45.   END
  46. GO
  47. ACTUALIZA_BD
  48. GO
  49. DROP PROCEDURE CREA_ARRAY_TMP
  50. DROP PROCEDURE ACTUALIZA_BD

Básicamente lo que hace es:
Extrae todas las bases de datos que empiezan con DATA y lo almacena en una tabla papelera
luego con un bucle quiero ir cambiando de base de datos y ejecutando la consulta para todas las bases de datos, este mismo código lo utilizo para eliminar tablas temporales y me funciona perfectamente pero aquí no.

Muchas gracias, espero que alguien me pueda ayudar Saludos.

Última edición por gnzsoloyo; 13/06/2013 a las 20:04
  #2 (permalink)  
Antiguo 13/06/2013, 14:06
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Recorrer varias bases de datos de una instancia

debes de usar la siguiente instruccion

exec sp_MSforeachdb

lo que hace esta instruccion es correr un query en cada base de datos que tengas, para mas referencia consulta:

http://weblogs.sqlteam.com/joew/arch.../27/60700.aspx

y para que un procedure? si no tienes permisos para crear procedures que haces?? no has probado con tablas temporales?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 17/06/2013, 10:19
 
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Recorrer varias bases de datos de una instancia

Investigando la funcion sp_MSforeachdb logre hacer lo que buscaba
exec sp_msforeachdb @command1 = N' use ? ;
if Exists(SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE=''BASE TABLE'' AND TABLE_NAME=''COA'')
ALTER TABLE COA
ALTER column DIRECCION varchar(150);'

Gracias por la respuesta y mil disculpas por la demora en responder
Saludos

Etiquetas: bases, funcion, instancia, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:27.