【问题标题】:Batching Stored Procedure Commands in EF 4.2在 EF 4.2 中批处理存储过程命令
【发布时间】:2012-06-27 05:10:45
【问题描述】:

我调用了一个存储过程,它基本上是一个 INSERT 存储过程。它插入到表 A 中,然后以表 A 中的标识插入到表 B 中。

现在,我需要从我的应用程序代码中调用这个存储过程 N 次。

有什么办法可以批量处理吗?目前它正在对数据库进行 N 次往返,我希望它是一次。

我能想到的唯一方法是通过用户定义的表类型通过网络传递整个项目列表。

但是这种方法的问题是我需要在存储过程中使用一个 CURSOR 来遍历每个项目以进行插入(因为标识字段)。

基本上,我们可以用 EF 4.2 批处理 DbCommand.ExecuteNonQuery() 吗?

或者我们可以用 Dapper 之类的东西来做吗?

【问题讨论】:

    标签: c# stored-procedures sql-server-2012 batching entity-framework-4.2


    【解决方案1】:

    您可以保持这样,在存储过程中只需在目标表和表参数之间执行MERGE。因为您总是带着新记录而来,所以MERGE 将只进入INSERT 分支。

    在这种情况下,像这样使用MERGE 是一种无需游标即可进行批量插入的简单方法。

    另外,另一种避免使用游标的方法是在 SP 中使用 INSERT from SELECT 语句。

    【讨论】:

    • 我不能这样做,因为每次插入表 A 都需要 IDENTITY 字段。存储的过程需要执行 2 次插入,表 A(获取标识),然后表 b(使用新身份)。我可以通过合并(或从选择插入)将一堆记录插入表 a 没问题,但我如何将记录以身份放入表 b 中?我不能,除非我加入另一个领域(这不是唯一的,因此也不起作用)
    • @RPM1984: 将OUTPUT 语句用于表A 中的MERGE,然后使用它插入表B 中呢? OUTPUT 可以在临时表或表变量中为您提供标识列+您可能想要的任何其他列,您可以使用它插入 B。如果我没有遗漏任何关于 A 和B.
    • 啊,现在你开始做点什么了……会试试这个,然后回复你。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多