2

SQL Serverに多くのデータベース(50以上)があります。すべてのデータベースは同一です。各データベースには、DBVersionという名前のテーブルがあります。各DBVersionには、varchar型の「Version」という列があります。このテーブルには、常に1つのレコードが存在します。

すべてのデータベースをループして、テーブルDBVersionから「バージョン」を選択し、Microsft SQL Server Management Studioで結果を印刷するにはどうすればよいですか?

結果は次のようになります。

  1. データベース1-バージョン:5
  2. データベース2-バージョン:8
  3. Database50-バージョン:6

前もって感謝します。

4

2 に答える 2

2

データベースがSQL-Serverの同じインスタンス上にある場合は、sp_msforeachdbを使用してデータベースを反復処理できます。

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;

文書化されていない手順の使用には懐疑的な見方があるため、カーソルを使用してこれを書き直すことができます。

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;
于 2013-01-08T12:12:21.070 に答える
0

これはあなたを助けますか?

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
....
于 2013-01-08T12:02:32.397 に答える