【问题标题】:Select a field from a table from multiple databases in SQL Server从 SQL Server 中多个数据库的表中选择一个字段
【发布时间】:2012-12-22 06:33:46
【问题描述】:

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

如何遍历所有数据库,从 DBVersion 表中选择“版本”并在 Microsft SQL Server Management Studio 中打印结果?

结果应该是这样的:

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

提前致谢。

【问题讨论】:

  • 所有这些数据库都在同一个 SQL-Server 实例上吗?

标签: sql sql-server


【解决方案1】:

如果数据库在同一个 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;

【讨论】:

  • 非常感谢!我使用第一种方法遍历同一 SQL Server 实例上的所有数据库。
【解决方案2】:

这对你有帮助吗?

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
....

【讨论】:

  • 需要添加schema -> database.schema.dbversion
  • 改进这个答案,您可以使用 for 循环动态生成选择字符串并使用 EXEC 执行它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多