SqlBulkCopy用于存储过程

5
SqlBulkCopy旨在帮助执行大量插入而不是发送单个插入语句。但是调用存储过程呢?我有一个存储过程,数据传递给它,然后在另一个表中进行一些查找,并可能对该查找表进行第二次插入。
由于这无法转换为查询,是否有一种方法可以使用SqlBulkCopy调用存储过程,或者这样做没有任何意义?
每个数据库连接一次只进行2000次或更少的调用,但想知道是否有更有效的方法。

数据库效率还是应用程序效率? - Austin Salonen
@Autstin SqlBulkCopy 的目的是帮助在 SQL 端提高效率。 - Dustin Davis
3个回答

5

根据@Kev的答案,您可以将数据批量插入到一个暂存表中,然后可以使用触发器启动存储过程。

我假设您有一个与其他表相关联的外键约束,因此您需要在插入目标表之前获取该值。如果可能的话,您可以尝试删除约束。进行批量插入,然后触发器只需在之后更新列即可。


这也适用于 SqlBulkCopy.BatchSize - 对于非常大的数据块非常方便,因为它为您提供了批处理处理。 - bland

1
我能想到的唯一方法是在目标表上设置触发器并设置SqlBulkCopyOptions FireTriggers选项。
从那里,您可以调用存储过程或将存储过程逻辑放在该触发器中。
如果其他客户端(例如Web应用程序)附加到表,则需要某种区分批量复制客户端和其他常规应用程序的方式。我猜您可以通过在连接字符串中设置Application Name值并在触发器中使用SELECT APP_NAME()来区分它。

触发器无法工作,因为存储过程必须首先从另一个表中进行选择以查看是否存在键,如果不存在,则插入并获取键,然后再将其插入目标表。因此,它实际上是一个选择、[插入]、插入的过程。 - Dustin Davis

0

如果您想在每行插入时运行存储过程,那么您有点打破了插入的目的,即快速插入大量记录。我建议先插入到一个临时表中,然后修改存储过程,使用集合逻辑一次性操作整个数据集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接