C# 存储过程的SqlBulkCopy

C# 存储过程的SqlBulkCopy,c#,.net,C#,.net,SqlBulkCopy应该可以帮助执行大量插入,而不是发送单个插入语句。但是调用存储过程呢?我有一个过程,将数据传递给它,然后它在另一个表中进行一些查找,并可能在该查找表中进行第二次插入 由于这不能转换为查询,有没有一种方法可以将SqlBulkCopy用于存储过程调用,或者它没有任何意义 每个db连接一次只能调用2000个或更少的调用,但我想知道是否有更有效的方法。唯一可以想到的方法是在目标表上设置触发器并设置FireTriggers选项 从那里,您可以调用存储过程或将存储过程逻辑放入触发器中

SqlBulkCopy应该可以帮助执行大量插入,而不是发送单个插入语句。但是调用存储过程呢?我有一个过程,将数据传递给它,然后它在另一个表中进行一些查找,并可能在该查找表中进行第二次插入

由于这不能转换为查询,有没有一种方法可以将SqlBulkCopy用于存储过程调用,或者它没有任何意义


每个db连接一次只能调用2000个或更少的调用,但我想知道是否有更有效的方法。

唯一可以想到的方法是在目标表上设置触发器并设置
FireTriggers
选项

从那里,您可以调用存储过程或将存储过程逻辑放入触发器中


如果该表由其他客户端(例如web应用程序)附加,则您需要有某种方式区分批量复制客户端和其他常规应用程序。我想您可以通过在连接字符串中设置应用程序名称值并在触发器中使用基于@Kev answer的
SELECT APP_Name()

检查它来区分,您可以将大容量插入到暂存表中,然后启动存储过程的触发器


我假设对另一个表有FK约束,因此在插入到目标表之前需要该值。如果可能,您可以尝试删除约束。执行大容量插入之后,触发器就可以更新列了

如果您想在插入的每一行上运行存储过程,那么您就有点违背了插入的目的,即快速插入大量记录。我将插入到一个暂存表中,然后修改存储的进程,以使用设置逻辑一次对整个数据集进行操作。

数据库效率还是应用程序效率?@Autstin SqlBulkCopy旨在帮助提高SQL端的效率。触发器不起作用,因为存储过程必须先从另一个表中选择,以查看是否存在键,如果没有,则插入并获取键,然后插入到目标表中。因此,它实际上是一个select、[insert、]insert。这也适用于SqlBulkCopy.BatchSize-非常方便于非常大的数据块,因为它为您提供了批处理。