una todas tablas significa restaurar que nivel migrar listar las instalar datos compatibilidad cambiar bases sql-server sql-server-2008-r2 multiple-databases

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