需要将多个记录插入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来检查行是否存在,只有在不存在的情况下,然后我才进行插入。
希望更好地了解哪种方法是性能优化的。还想了解上述查询是否已优化。
答案 0 :(得分:0)
您的代码看起来不错,但我可能会提出一些建议。
首先,使用CreatedDate
和ModifiedDate
的默认值。这样,每次插入行时都不需要设置值。
其次,我不是NOT IN
的粉丝,而是更喜欢NOT EXISTS
。我更喜欢NOT EXISTS
,因为当子查询返回NULL
值时,它更直观。但是,我猜测Id
是FMData
中的主键,因此它永远不会是NULL
。
第三,Id
应该有一个索引。 。 。它将作为主键。
第四,代码不是线程安全的,这意味着同时运行相同的代码两次可能会产生错误。我猜这个代码不是问题,但如果是这样,你可以调查table locking hints。
除Id
上存在索引外,这些评论都没有解决性能问题。从性能角度来看,您的代码应该没问题。