![](/img/trans.png)
[英]Atomicity of a INSERT SELECT UNION ALL in Sql Server 2016
[英]SQL Server 2016 - Batch select and insert data between tables
我的任務是在 2 個表之間復制數據,並且由於較小的集合是 4000 萬條記錄(最大的幾乎是 100 倍),所以我正試圖以較小的批次打破集合。
在我的測試結束時,我會將邏輯放入 SSIS 任務中,但到目前為止,我無法進行 while 循環.. 循環,它寫入第一批然后退出。
我的表有一個 PK 我用於訂單和偏移量 function 但是使用過濾器,返回的 ID 不連續,所以我不確定分頁 function 是否正常工作。
聲明是這樣的:
DECLARE @RowsProcessed int = 0;
DECLARE @Batch int = 100000;
DECLARE @RowCount int = 1;
DECLARE @String AS INT = 13
WHILE @RowCount!= 0
BEGIN
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1
(
... )
SELECT
*
FROM
Table2
WHERE
Filter1 = @String
ORDER BY
ID
OFFSET @RowsProcessed ROWS
FETCH NEXT @Batch ROWS ONLY
SET IDENTITY_INSERT Table1 OFF
SET @RowCount = @@ROWCOUNT
PRINT @RowCount
SET @RowsProcessed += @Batch
END'
我的想法是分塊讀取數據,因為源表非常大,我想限制 tempdb 的問題,但我無法找到解決非連續 ids 問題的方法,除非使用 CTE 和RANK OVER,但我認為這需要掃描所有表,我錯了嗎?
提前感謝您的任何建議,任
SET @RowCount = @@ROWCOUNT
需要更早,緊跟在插入之后,在SET IDENTITY_INSERT Table1 OFF
之前
非常感謝@Charlieface,我不知道SET IDENTITY_INSERT
會干擾 Rowcount 變量。 真的謝謝!
至於@NielsBerglund:我需要將一組無序過濾數據從大表復制到小表(可能使用SSIS 中的上述邏輯)。 最后,我將復制所有表,並對某些特殊類型的行進行一些修改。 我試圖找到一種方法,不在單個事務中處理 select 40bln 記錄,而在我看來,OFFSET FETCH 似乎是實現它的最佳方法。
再次感謝,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.