私は移行を計画しており、あるサーバーから別のサーバーに移行する行数を取得しようとしています。私はタイムアウトを維持する動的クエリを書いており、私たちが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