2017-03-03 21 views
2

我正在計劃一個遷移並嘗試獲取我將從一臺服務器遷移到另一臺服務器的行數。我已經寫了一個動態查詢來保持超時,並且我不確定從服務器上的所有數據庫獲取行數的最佳方式,因爲我們有超過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 
+0

難道你不想在輸出中看到DBName和行數嗎?你只有行數是無用的。 –

+0

@SeanLange目前整體計數很好,但顯然你是對的我不會介意按數據庫名稱分組計數。 – VGJ

回答

1

你真的不需要遊標,表變量或任何循環在這裏。我們可以利用動態sql在所有數據庫中生成全面的查詢。以下是如何在您的實例上跨每個數據庫執行此查詢(有一些例外)。

declare @SQL nvarchar(max) = N''; 

select @SQL = @SQL + 
    N'SELECT DatabaseName = ''' + QUOTENAME(d.name) + N'''  
     ,SUM(sdmvPTNS.row_count) AS [RowCount] 
    FROM ' + QUOTENAME(d.name) + N'.sys.objects AS sOBJ 
    INNER JOIN ' + QUOTENAME(d.name) + N'.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 UNION ALL ' 
from sys.databases d 
where name not in ('master', 'tempdb', 'model', 'msdb') 

set @SQL = left(@SQL, len(@SQL) - 10) --Need to remove the last UNION ALL 

--select @SQL 
exec sp_executesql @SQL 
+0

看起來非常乾淨整潔!也是一種魅力。謝謝 – VGJ

+0

很高興爲你工作。乾杯! –

相關問題