2017-03-03 4 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

あなたのために働いてうれしい。乾杯! –