naregkar
naregkar

Reputation: 423

Select a field from a table from multiple databases in SQL Server

I have many databases (more than 50) on SQL Server. All databases are identical. Each database has a table named DBVersion. Each DBVersion has a column: "Version" which is of type varchar. In this table, always one record exists.

How can I loop through all the databases, select the "Version" from the table DBVersion and print in Microsft SQL Server Management studio the results?

The result should look like:

  1. Database1 - Version: 5
  2. Database2 - Version: 8
  3. Database50 - Version: 6

Thanks in advance.

Upvotes: 2

Views: 3283

Answers (2)

GarethD
GarethD

Reputation: 69769

You can use sp_msforeachdb to itereate databases if they are on the same instance of SQL-Server

CREATE TABLE #tmp (DatabaseName VARCHAR(50), Version VARCHAR(200));

EXECUTE master.sys.sp_MSforeachdb '
                                USE [?]; 
                                IF EXISTS 
                                    (   SELECT  1
                                        FROM    sys.tables
                                        WHERE   [Object_ID] = OBJECT_ID(N''dbo.DBVersion'')
                                    )
                                    BEGIN
                                        INSERT #tmp (DatabaseName, Version) 
                                        SELECT ''?'', [Version] 
                                        FROM    dbo.DBVersion
                                    END';

SELECT  *
FROM    #tmp;

DROP TABLE #tmp;

There is some sceptisism about using undocumented procedures, so you could rewrite this with a cursor:

CREATE TABLE #tmp (DatabaseName VARCHAR(50), Version VARCHAR(200));

DECLARE DBCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR
    SELECT  Name
    FROM    sys.databases;
OPEN DBCursor;

DECLARE @DBName VARCHAR(200) = '';
FETCH NEXT FROM DBCursor INTO @DBName;

WHILE @@FETCH_STATUS != 0
    BEGIN
        DECLARE @SQL NVARCHAR(MAX) = N'USE ' + QUOTENAME(@DBName) + '
                                        IF EXISTS 
                                            (   SELECT  1
                                                FROM    sys.tables
                                                WHERE   [Object_ID] = OBJECT_ID(N''dbo.DBVersion'')
                                            )
                                            BEGIN
                                                INSERT #tmp (DatabaseName, Version) 
                                                SELECT @DB, [Version] 
                                                FROM    dbo.DBVersion
                                            END';
        EXECUTE SP_EXECUTESQL @SQL, N'@DB VARCHAR(200)', @DBName;

        FETCH NEXT FROM DBCursor INTO @DBName;
    END

CLOSE DBCursor;
DEALLOCATE DBCursor;

SELECT  *
FROM    #tmp;

DROP TABLE #tmp;

Upvotes: 2

TechDo
TechDo

Reputation: 18639

Will this help you?

SELECT 'Database1-Version:'+CAST(Version AS NVARCHAR) FROM Database1.schemaname.DBVersion UNION
SELECT 'Database2-Version:'+CAST(Version AS NVARCHAR) FROM Database2.schemaname.dbo.DBVersion UNION
....

Upvotes: 0

Related Questions