首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C# SQLCLR存储过程批量插入SQLCLR的最快方法

从C# SQLCLR存储过程批量插入SQLCLR的最快方法
EN

Stack Overflow用户
提问于 2017-10-13 12:08:34
回答 1查看 4.3K关注 0票数 3

我有一个C# SQLCLR存储过程,首先在某些字典中填充数据,然后计算数据,然后将输出存储在其他字典中。

由于字典的使用,这个计算非常快,完全证明了我需要使用CLR存储的Proc而不是普通的SQL存储Proc。

但是,我必须从这些输出字典中将数据保存在SQL中的某些表中,这个部分花费了大量时间,并且满足了我对整个SQLCLR的更快的需求。

我必须迭代每个输出字典的每个键,然后创建Insert查询,然后以下列方式运行ExecuteNonQuery:

因此,我如何改进我的这种方法,使它不需要时间来插入数据。我不能使用SqlBulkCopy作为它不接受进程内上下文连接。 (即"Context Connection = true;")作为connectionString。那么,还有其他更快的方法可用吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-13 12:49:29

你有几个选择:

  1. 创建用户定义的表类型( UDTT )和接受UDTT作为参数(即表值参数(TVP))的TVP存储过程。由于集合中已经有数据,所以绝对不要创建单独的DataTable来将数据传输到其中,因为这只是浪费时间、内存和CPU。您可以通过创建一个返回IEnumerable<SqlDataRecord>、使用yield return;并作为表示UDTT的SqlParameter值的方法直接将其本机集合中的数据流到TVP中。我在这里有两个例子:
代码语言:javascript
复制
- [How can I insert 10 million records in the shortest time possible?](https://stackoverflow.com/questions/25770180/how-can-i-insert-10-million-records-in-the-shortest-time-possible/25773471#25773471)
- [Pass Dictionary<string,int> to Stored Procedure T-SQL](https://stackoverflow.com/questions/19957132/pass-dictionarystring-int-to-stored-procedure-t-sql/25815939#25815939)

  1. 如果只有一个表要填充(因此只有一个结果集),那么可以从存储过程输出作为结果集的集合,并按如下方式使用: 插入schema.table (column_list) EXEC schema.SQLCLR_stored_procedure @param1 1,.;
  2. 如果只有一个表要填充(因此只有一个结果集),而且如果您没有在上下文连接上执行任何违反标量函数规则的操作,那么您可以尝试将SQLCLR存储过程更改为TVF,返回IEnumerable,并通过yield return;迭代返回以将其流出。几年前,我在Server上用一个示例编写了一篇文章:具有全流的CLR表值函数示例(STVF / TVF)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46729605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档