来自多个SQL实例/服务器的行数

时间:2017-02-08 15:18:04

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

我被要求为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上。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用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 ; 获取行数。这样你就可以一次性获得所有行数(没有循环,游标或其他流控制逻辑):

var data = { 7: { bezeichnung: "Sample 1", startdate: "2010-02-01" }, 52: { bezeichnung: "Sample 2", startdate: "2011-04-23" }, 53: { bezeichnung: "Sample 3", startdate: "2016-07-02" }, 65: { bezeichnung: "Sample 4", startdate: "2013-04-21" }, 84: { bezeichnung: "Sample 5", startdate: "2012-02-25" }, 85: { bezeichnung: "Sample 6", startdate: "2016-08-22" } },
    result = { arr: Object.keys(data).map(function (k) {
        return data[k];
    }) };

console.log(result);

答案 1 :(得分:0)

您是否考虑过使用信息架构?这可能是一些动态SQL的最佳前进方式。在页面DYnamic SQL examples

上有一些关于此的好帖子