sql-server - todas - que significa compatibilidad de base de datos
¿Cómo ejecutar la misma consulta en todas las bases de datos en una instancia? (3)
Tengo (para fines de prueba) muchos dbs con el mismo esquema (= las mismas tablas y columnas, básicamente) en una instancia de sql server 2008 r2.
Me gustaría una consulta como
SELECT COUNT(*) FROM CUSTOMERS
en todos los DB en la instancia. Me gustaría tener como resultado 2 columnas:
1 - el nombre de la base de datos
2 - el valor de COUNT(*)
Ejemplo:
DBName // COUNT (*)
TestDB1 // 4
MyDB // 5
etc...
Nota: supongo que la tabla CUSTOMERS
existe en todos los dbs (excepto el master
).
Consulta directa
EXECUTE sp_MSForEachDB
''USE ?; SELECT DB_NAME()AS DBName,
COUNT(1)AS [Count] FROM CUSTOMERS''
Esta consulta le mostrará lo que desea ver, pero también arrojará errores para cada DB sin una tabla llamada "CLIENTES". Tendrá que elaborar una lógica para manejar eso.
Raj
Prueba este -
SET NOCOUNT ON;
IF OBJECT_ID (N''tempdb.dbo.#temp'') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp
(
[COUNT] INT
, DB VARCHAR(50)
)
DECLARE @TableName NVARCHAR(50)
SELECT @TableName = ''[dbo].[CUSTOMERS]''
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
SELECT CHAR(13) + ''SELECT '''''' + name + '''''', COUNT(1) FROM ['' + name + ''].'' + @TableName
FROM sys.databases
WHERE OBJECT_ID(name + ''.'' + @TableName) IS NOT NULL
FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''')
INSERT INTO #temp (DB, [COUNT])
EXEC sys.sp_executesql @SQL
SELECT *
FROM #temp t
Salida (por ejemplo, en AdventureWorks
) -
COUNT DB
----------- --------------------------------------------------
19972 AdventureWorks2008R2
19975 AdventureWorks2012
19472 AdventureWorks2008R2_Live
Qué tal algo como esto:
DECLARE c_db_names CURSOR FOR
SELECT name
FROM sys.databases
WHERE name NOT IN(''master'', ''tempdb'') --might need to exclude more dbs
OPEN c_db_names
FETCH c_db_names INTO @db_name
WHILE @@Fetch_Status = 0
BEGIN
EXEC(''
INSERT INTO #report
SELECT
'''''' + @db_name + ''''''
,COUNT(*)
FROM '' + @db_name + ''..linkfile
'')
FETCH c_db_names INTO @db_name
END
CLOSE c_db_names
DEALLOCATE c_db_names
SELECT * FROM #report