Rya*_*don 8 sql sql-server insert
我正在尝试将行从一个表批量插入到另一个表。
DECLARE @batch INT = 10000;
WHILE @batch > 0
BEGIN
BEGIN TRANSACTION
INSERT into table2
select top (@batch) *
FROM table1
SET @batch = @@ROWCOUNT
COMMIT TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)
它在前 10,000 个上运行并插入它们。然后我收到错误消息“无法插入重复的键”,它试图插入相同的主键,所以我假设它试图重复同一批次。我在这里缺少什么逻辑来循环批次?可能很简单,但我无法弄清楚。
有人可以帮忙吗?谢谢
das*_*ght 14
您的代码不断插入相同的行。您可以通过对插入内容进行“分页”来避免这种情况:
DECLARE @batch INT = 10000;
DECLARE @page INT = 0
DECLARE @lastCount INT = 1
WHILE @lastCount > 0
BEGIN
BEGIN TRANSACTION
INSERT into table2
SELECT col1, col2, ... -- list columns explicitly
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY YourPrimaryKey ) AS RowNum, *
FROM table1
) AS RowConstrainedResult
WHERE RowNum >= (@page * @batch) AND RowNum < ((@page+1) * @batch)
SET @lastCount = @@ROWCOUNT
SET @page = @page + 1
COMMIT TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)
您需要某种方法来消除现有的行。您似乎有一个主键,因此:
INSERT into table2
SELECT TOP (@batch) *
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.id = t1.id);
Run Code Online (Sandbox Code Playgroud)