我被要求为4个数据库中的每个表生成行计数,并将结果记录在第5个数据库中。
每个数据库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上把所有的东西放在一起。
任何帮助都是非常感谢的。
发布于 2017-02-08 07:37:54
您可以使用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
;
发布于 2017-02-08 07:25:19
您研究过使用信息模式吗?这可能是与一些动态SQL一起前进的最佳方式。关于这一点,DYnamic SQL examples页面上有一些很好的文章
https://stackoverflow.com/questions/42116956
复制