2

我在 SQL Server 上有很多数据库(超过 50 个)。所有数据库都是相同的。每个数据库都有一个名为 DBVersion 的表。每个 DBVersion 都有一个列:“Version”,它是 varchar 类型的。在此表中,始终存在一条记录。

如何遍历所有数据库,从 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 回答