我正在計劃一個遷移並嘗試獲取我將從一臺服務器遷移到另一臺服務器的行數。我已經寫了一個動態查詢來保持超時,並且我不確定從服務器上的所有數據庫獲取行數的最佳方式,因爲我們有超過500個數據庫。我附上了我迄今爲止編寫的代碼。來自所有SQL Server數據庫的行數
DECLARE @sql NVARCHAR(MAX);
DECLARE @ix INT = 1;
DECLARE @temptbl TABLE (
dbname VARCHAR(500),
cnt INT
)
DECLARE @dbs TABLE (
dbname NVARCHAR(500)
)
SET @sql = CAST(N'' AS NVARCHAR(MAX));
INSERT INTO @dbs
SELECT
Org_dbname
FROM [ourdatabases].dbo.tbl_datbases om
INNER JOIN sys.databases S
ON om.Org_dbname = S.name
WHERE Org_dbname IS NOT NULL
;
DECLARE @dbname VARCHAR(255)
WHILE EXISTS (SELECT
*
FROM @dbs)
BEGIN
SELECT TOP 1
@dbname = dbname
FROM @dbs
PRINT @dbname
SELECT
@sql = @sql + N'
use ' + QUOTENAME(@dbname) + ';
SELECT
SUM(q1.[RowCount]) cnt
FROM (SELECT
QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + ''.'' + QUOTENAME(sOBJ.name) AS [TableName]
,SUM(sdmvPTNS.row_count) AS [RowCount]
FROM sys.objects AS sOBJ
INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
ON sOBJ.object_id = sdmvPTNS.object_id
WHERE sOBJ.type = ''U''
AND sOBJ.is_ms_shipped = 0x0
AND sdmvPTNS.index_id < 2
GROUP BY sOBJ.schema_id
,sOBJ.name) q1
'
DELETE FROM @dbs
WHERE dbname = @dbname
END
SET @sql = STUFF(@sql, 1, 10, '');
PRINT @sql
INSERT INTO @temptbl
EXEC sp_executesql @sql
SELECT
SUM(cnt)
FROM @temptbl
難道你不想在輸出中看到DBName和行數嗎?你只有行數是無用的。 –
@SeanLange目前整體計數很好,但顯然你是對的我不會介意按數據庫名稱分組計數。 – VGJ