En ocasiones necesitamos realizar el mismo query en todas las bases de datos de un servidor. Imaginemos un servidor que tiene muchas bases de datos, cada base de datos es una sucursal, y nos gustaría saber, en que base de datos hay empleados dados de alta y en cual no, esto para saber que base de datos sobra y poderla borrar, o para lo que se les ocurra.
El procedimiento sp_MSforeachdb no esta documentado en Microsoft por lo que resulta complejo entenderlo, sin embargo, este procedimiento utiliza un parámetro de tipo varchar para enviar el comando que le indiquemos. Pero vamos a realizarlo que es como aprendemos y como nos gusta.
Creando las bases de datos
create database SUCURSAL1
GO
CREATE DATABASE SUCURSAL2
GO
CREATE DATABASE SUCURSAL3
GO
Creando las tablas de empleados en las tres sucursales
use SUCURSAL1
GO
CREATE TABLE EMPLEADOS(
ID INT PRIMARY KEY IDENTITY,
NOMBRE VARCHAR(MAX),
APELLIDOP VARCHAR(MAX),
APELLIDOM VARCHAR(MAX))
GO
use SUCURSAL2
GO
CREATE TABLE EMPLEADOS(
ID INT PRIMARY KEY IDENTITY,
NOMBRE VARCHAR(MAX),
APELLIDOP VARCHAR(MAX),
APELLIDOM VARCHAR(MAX))
GO
use SUCURSAL3
GO
CREATE TABLE EMPLEADOS(
ID INT PRIMARY KEY IDENTITY,
NOMBRE VARCHAR(MAX),
APELLIDOP VARCHAR(MAX),
APELLIDOM VARCHAR(MAX))
GO
Llenando las tablas de las sucursales
use SUCURSAL1
GO
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('EMMANUEL', 'URIAS', 'ROBLES')
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('JESUS', 'GUTIERREZ', 'LANDA')
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('JAVIER', 'HERNANDEZ', 'BALCAZAR')
USE SUCURSAL3
GO
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('MARCELA', 'GUERRERO', 'ESPINOZA')
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('LAURA', 'SERRANO', 'FLORES')
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('LUISA', 'ROBLES', 'MENDOZA')
INSERT INTO EMPLEADOS (NOMBRE, APELLIDOP, APELLIDOM) VALUES ('PATRICIA', 'FERNANDEZ', 'GONZALEZ')
Ejecutar la misma consulta en todas las bases de datos
use SUCURSAL1
GO
SELECT COUNT(*) as [NUMERO DE EMPLEADOS] FROM EMPLEADOS
GO.
use master
go
DECLARE @COMANDO varchar(max)
set @COMANDO = 'use [?] SELECT COUNT(*) as
[NUMERO DE EMPLEADOS] FROM EMPLEADOS'
exec sp_msForEachDb @comando
Msg 208, Level 16, State 1, Line 3
Invalid object name 'EMPLEADOS'.
Msg 208, Level 16, State 1, Line 3
Invalid object name 'EMPLEADOS'.
Msg 208, Level 16, State 1, Line 3
Invalid object name 'EMPLEADOS'.
Msg 208, Level 16, State 1, Line 3
Invalid object name 'EMPLEADOS'.
use master
go
DECLARE @COMANDO varchar(max)
set @COMANDO = 'IF ''?'' NOT
IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
SELECT COUNT(*) as [NUMERO DE
EMPLEADOS] FROM EMPLEADOS
END'
exec sp_msForEachDb @comando
use master
go
DECLARE @COMANDO varchar(max)
set @COMANDO = 'IF ''?'' NOT
IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
SELECT DB_NAME(), COUNT(*) as [NUMERO
DE EMPLEADOS] FROM EMPLEADOS
END'
exec sp_msForEachDb @comando
Ahora si, al ejecutar la sentencia anterior, obtendremos este resultado:
Como vemos, ahora si aparece el nombre de la sucursal, con la cantidad de empleado que tiene cada una, ya sería cuestión de jugar con operador WHERE para mostrar las que no tienen empleados, o las que si tienen empleados, pero eso ya será de acuerdo a la necesidad.
Hasta aquí el post, espero compartan, comenten, pregunten o den clic a algún anuncio patrocinado, eso me ayudaría bastante.
Saludos
Hola, muy buena explicación, tengo una consulta, supongamos que cada empleado tiene una identificación y necesito obtener todos las identificaciones de todas las sucursales en una misma tabla y sin que estén repetidas, como se haría ahí!, Gracias de antemano
ResponderBorrarintenta utilizar el union all, pero ahi tendria que ser manual a cada base de datos
BorrarEste comentario ha sido eliminado por el autor.
ResponderBorrarPodras hacer algo similar, pero para mysql, no logro encontrar un ejemplo que lo explique como lo hiciste aca.
ResponderBorrarmuy buen aporte gracias
ResponderBorrar