【问题标题】:Row counts from multiple SQL instances/Servers来自多个 SQL 实例/服务器的行数
【发布时间】:2017-02-08 15:18:04
【问题描述】:

我被要求为 4 个数据库中的每个表生成行计数,并将结果记录在第 5 个数据库中。

  • Database_1 位于 Server_a 上
  • Database_2 在 Server_b 上
  • Database_3 位于 Server_c 上
  • Database_4 在 Server_d 上
  • Database_5 位于 Server_e 上

每个数据库 1 到 4 中的表列表完全相同。有时表列表会根据用户要求增加/减少,但所有 4 个数据库将完全相同

在需要结果的 Database_5 中,他们只需要一个包含以下字段的表:

DateRun (Date row count run), Table_Name, DB1, DB2, DB3, DB4

字段 DB1 到 DB4 是存储行计数结果的位置。

我知道如何链接服务器,我可以使用 sp_msforeachtable。但我只是不知道如何从一台服务器获取表列表到 Table_Name,然后将所有 4 个数据库的记录计数填充到字段 DB1、DB2、DB3 和 DB4 中

我猜第一个查询需要从 DB1 生成表和行计数列表并将其插入到 DB5 中。

然后从 DB2 中选择行计数并更新表名相同的 DB5.DB2。

接着是来自 DB3 的行计数,并更新 DB5.DB3,其中表名相同。

对 DB4 重复。

还是我都搞错了。

查询会在 DB5 上运行,还是需要在每台服务器上运行查询然后插入 DB5?我宁愿把所有东西都放在 DB5 上。

非常感谢任何帮助。

【问题讨论】:

    标签: sql-server database sql-server-2012 linked-server rowcount


    【解决方案1】:

    您可以使用sys.partitions 获取行数。这样您就可以一次性获取所有行数(无需循环、游标或其他流控制逻辑):

    CREATE TABLE #Results(
        RunId INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
        DateRun DATE NOT NULL,
        Table_Name VARCHAR(100) NOT NULL,
        DB1 INT NOT NULL,
        DB2 INT NOT NULL,
        DB3 INT NOT NULL,
        DB4 INT NOT NULL
    )
    
    INSERT INTO #Results(
        DateRun,
        Table_Name,
        DB1,
        DB2,
        DB3,
        DB4
    )
    
    SELECT GETDATE()
            ,db1.name
            ,db1.DB1_Rows
            ,db2.DB2_Rows
            ,db3.DB3_Rows
            ,db4.DB4_Rows
    FROM (
            SELECT   t.name
                    ,p.rows AS DB1_Rows
            FROM DB1.sys.tables t
            INNER JOIN DB1.sys.indexes i ON t.OBJECT_ID = i.object_id
            INNER JOIN DB1.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    ) db1
        full outer JOIN
            (
                SELECT   t.name
                        ,p.rows AS DB2_Rows
                FROM DB2.sys.tables t
                INNER JOIN DB2.sys.indexes i ON t.OBJECT_ID = i.object_id
                INNER JOIN DB2.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
            ) db2
        ON db1.name = db2.name
        INNER JOIN
            (
                SELECT   t.name
                        ,p.rows AS DB3_Rows
                FROM DB3.sys.tables t
                INNER JOIN DB3.sys.indexes i ON t.OBJECT_ID = i.object_id
                INNER JOIN DB3.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
            ) db3
        ON db1.name = d3.name
        INNER JOIN
            (
                SELECT   t.name
                        ,p.rows AS DB4_Rows
                FROM DB4.sys.tables t
                INNER JOIN DB4.sys.indexes i ON t.OBJECT_ID = i.object_id
                INNER JOIN DB4.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
            ) db4
        ON db1.name = db4.name
    ;
    

    【讨论】:

      【解决方案2】:

      您是否研究过使用信息架构?这可能是与一些动态 SQL 一起前进的最佳方式。在DYnamic SQL examples页面上有一些关于此的好帖子

      【讨论】:

        猜你喜欢
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多