在sql server中插入大容量数据,同时忽略/捕获重复行



我有一个excel文件行8000 - 10000之间。我在c#中将其转换为xml,并将其传递给存储过程以将其插入到表中。

在插入数据时,如果有一个条目已经存在于数据库中,我想忽略/捕获它,同时插入其余的行而不破坏插入。

我认为的解决方案之一是在表上创建一个插入触发器来检查行是否已经存在于表中,但是这种方法对于10,000行来说非常昂贵。

还有什么方法呢?下面是简写代码

 SELECT @sql = N'
    INSERT INTO Expenses ( '+ STUFF(@col,1,1,'') +')
    SELECT ' + STUFF(@col,1,1,'') + '
    FROM #TEMPTABLE t
    PIVOT (
        MAX([Value]) FOR AttributeName IN (' + STUFF(@col,1,1,'')+')
    ) as pvt'
    EXEC ( @sql )

如果您只关心表中已经存在的重复条目,您可以这样做:

with p as (<your pivot here>)
    insert into Expenses ( . . . )
        select p.*
        from p
        where not exists (select 1
                          from Expenses e
                          where e.entry = p.entry
                         );

对于您的特定情况,这可以正常工作——查找表中已经存在的条目并避免它们。但是,它不会删除临时表中的重复项。此外,它不会将Expenses中已有的数据与新数据合并。

我猜你真的想要merge。如果以上不能解决你的问题,那就问另一个问题。这个问题没有提供足够的信息来解释merge溶液是什么样子的。另一个问题将包含示例数据和期望的结果。

相关内容