it-swarm.com.de

Wie kann dieselbe Abfrage für alle Datenbanken einer Instanz ausgeführt werden?

Ich habe (zu Testzwecken) viele DBS mit demselben Schema (= dieselben Tabellen und Spalten im Grunde) auf einer SQL Server 2008 R2-Instanz.

ich hätte gerne eine Anfrage wie

SELECT COUNT(*) FROM CUSTOMERS

auf allen DBs in der Instanz. Ich möchte als Ergebnis 2 Spalten haben:

1 - der DB-Name

2 - der Wert von COUNT(*)

Beispiel:

DBName  //   COUNT (*)

TestDB1 // 4

MyDB  // 5

etc...

Hinweis: Ich gehe davon aus, dass die Tabelle CUSTOMERS in allen DBS existiert (außer master).

33
LaBracca

Probier diese -

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

Ausgabe (zum Beispiel in AdventureWorks) -

COUNT       DB
----------- --------------------------------------------------
19972       AdventureWorks2008R2
19975       AdventureWorks2012
19472       AdventureWorks2008R2_Live
42
Devart

Einfache Abfrage

EXECUTE sp_MSForEachDB 
        'USE ?; SELECT DB_NAME()AS DBName, 
        COUNT(1)AS [Count] FROM CUSTOMERS'

Diese Abfrage zeigt Ihnen, was Sie sehen möchten, wirft aber auch Fehler für jede DB ohne eine Tabelle mit dem Namen "CUSTOMERS". Sie müssen eine Logik ausarbeiten, um damit umzugehen.

Raj

32
Raj

Wie wäre es mit so etwas:

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
8
Dave Sexton