SQL Server将行复制到第二个表

时间:2017-02-08 15:47:43

标签: sql-server foreach

我有一个预订表(table_b),大约有1.3M行。第二个表(table_s)用于说明何时需要单独的应用程序访问这些行。

目前有触发器在table_s中创建记录,但这对所有现有数据没有帮助。

我相信我需要一个查询来选择table_b中存在但不存在table_s的行,然后为每一行插入一行。

这是我目前的语法,但不认为它已经正确形成

DECLARE @b_id  [INT] = 0;

WHILE(1 = 1)
BEGIN
    SELECT TOP 10 
        @b_id = MIN([b].[b_id])
    FROM 
        [table_b] AS [b]
    LEFT JOIN 
        [table_s] AS [s] ON [b].[b_id] = [s].[b_id]
    WHERE 
        [s].[b_id] IS NULL;

    IF @b_id IS NULL 
        BREAK;

    INSERT INTO [table_s] ([b_id], [processed])
    VALUES (@b_id, 0);
END;

1 个答案:

答案 0 :(得分:1)

语法上一切都很好。但是你的查询中存在一些误解

select top 10 @b_id = MIN(b.b_id) 

变量只能包含一个值,即使您选择top 10它也会将单个值赋给变量。您当前的方法将循环每个非现有记录

我认为没有100万条记录插入我们需要将插入分成批次。试试这种方式

INSERT INTO table_s
            (b_id,
             processed)
SELECT b_id,
       0
FROM   table_b AS b
WHERE  NOT EXISTS (SELECT 1
                   FROM   table_s AS s
                   WHERE  b.b_id = s.b_id)