更新或插入SQL Server时忽略错误行

时间:2013-06-19 10:17:44

标签: c# sql-server stored-procedures large-data

我的项目必须处理庞大的数据库。在最糟糕的情况下,它可能超过8千万行。

现在,我有2个表T1T2。我必须将表格T1中的数据复制到表格T2

  • 如果表T1中已存在表T2中的某一行(相同的主键),则将T1中该行的其他列的数据更新为T2 < / LI>
  • else将新行插入T2

首先,我使用while循环遍历T1中的8千万行,然后更新或插入T2。这非常非常慢,完成需要10个多小时。但是,如果任何行导致错误,我可以忽略它并捕获错误。

之后,我使用如下查询:

update Table2 
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2 
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID

这要快得多,只需要1到2个小时才能完成。但是,如果任何行有错误,则查询根本无法执行。

所以,我的问题是:

  • 以上查询是否可以忽略错误行并继续执行有效行?

  • 如果我无法做到这一点,我该怎样做才能比第一种方法跑得更快,还可以捕获错误行?

p / s:我试图将表格分成多个小部分,然后在同一时间更新或插入所有小部分,但它根本没有更快。

我用第二种方法解决了这个问题。我在插入或更新行时使用TRY_CAST来防止异常。任何无效的数据都将为NULL。完成后,我比较2表并找到不同的行。这些行是错误行。

3 个答案:

答案 0 :(得分:0)

至于你要求的功能我建议如下:

MERGE INTO table2 target
USING
(
  SELECT id, column1, column2 FROM table1
) source ([id], [column1], [column2])
ON target.[Id] = source.[Id]
WHEN MATCHED THEN
    UPDATE SET 
        target.Colum1 = source.Column1,
                target.COlumn2 = source.Column2
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN NOT MATCHED BY TARGET THEN
    INSERT ([Id], [Column1], [Column2])
    VALUES([Id], [Column1], [Column2])
;

至于忽略错误 - 我认为这是错误的。在这方面,我会投入一些精力进行数据验证

答案 1 :(得分:0)

您可以尝试从T2删除现有行,然后批量插入T1中的所有行。它取决于现有行的数量,如果它太大,那么这种方法将无效。

答案 2 :(得分:0)

我用第二种方法解决了这个问题。我在插入或更新行时使用TRY_CAST来防止异常。任何无效的数据都将为NULL。完成后,我比较2表并找到不同的行。这些行是错误行。