具有表值参数的批量插入具有重复行

时间:2016-12-09 11:25:23

标签: sql sql-server database sql-server-2008 tsql

需要将多个记录插入SQL表中。如果有重复项(已经插入的记录),那么我想忽略它们。

为了从我的代码向SQL发送多个记录,我使用的是表值参数。

我正在考虑两种选择。

选项1:对SQL表进行get调用并检查是否存在重复项并返回重复的行键。仅对那些不存在于SQL表中的行键的表值参数执行多次插入。

选项2:使用表值参数并调用批量插入。在SQL中执行重复检测并忽略重复的行。

实施的SQL如下:

@tvpNewFMdata是表值参数。

    INSERT INTO
        [dbo].[FMData]
        (
            [Id],
            [Name],
            [Path],
            [CreatedDate],
            [ModifiedDate]
        )
    SELECT 
        fm.Id, fm.Name, fm.Path, GETUTCDATE(), GETUTCDATE() 
    FROM 
        @tvpNewFMdata AS fm
    WHERE 
        fm.Id NOT IN 
        (
        SELECT 
            [Id] 
        FROM 
            [dbo].[FMdata]
        )

在SQL方法中,我首先选择select来检查行是否存在,只有在不存在的情况下,然后我才进行插入。

希望更好地了解哪种方法是性能优化的。还想了解上述查询是否已优化。

1 个答案:

答案 0 :(得分:0)

您的代码看起来不错,但我可能会提出一些建议。

首先,使用CreatedDateModifiedDate的默认值。这样,每次插入行时都不需要设置值。

其次,我不是NOT IN的粉丝,而是更喜欢NOT EXISTS。我更喜欢NOT EXISTS,因为当子查询返回NULL值时,它更直观。但是,我猜测IdFMData中的主键,因此它永远不会是NULL

第三,Id应该有一个索引。 。 。它将作为主键。

第四,代码不是线程安全的,这意味着同时运行相同的代码两次可能会产生错误。我猜这个代码不是问题,但如果是这样,你可以调查table locking hints

Id上存在索引外,这些评论都没有解决性能问题。从性能角度来看,您的代码应该没问题。