我有一个C# SQLCLR存储过程,首先在某些字典中填充数据,然后计算数据,然后将输出存储在其他字典中。
由于字典的使用,这个计算非常快,完全证明了我需要使用CLR存储的Proc而不是普通的SQL存储Proc。
但是,我必须从这些输出字典中将数据保存在SQL中的某些表中,这个部分花费了大量时间,并且满足了我对整个SQLCLR的更快的需求。
我必须迭代每个输出字典的每个键,然后创建Insert查询,然后以下列方式运行ExecuteNonQuery:

因此,我如何改进我的这种方法,使它不需要时间来插入数据。我不能使用SqlBulkCopy作为它不接受进程内上下文连接。 (即"Context Connection = true;")作为connectionString。那么,还有其他更快的方法可用吗?提前谢谢。
发布于 2017-10-13 12:49:29
你有几个选择:
DataTable来将数据传输到其中,因为这只是浪费时间、内存和CPU。您可以通过创建一个返回IEnumerable<SqlDataRecord>、使用yield return;并作为表示UDTT的SqlParameter值的方法直接将其本机集合中的数据流到TVP中。我在这里有两个例子:- [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)
IEnumerable,并通过yield return;迭代返回以将其流出。几年前,我在Server上用一个示例编写了一篇文章:具有全流的CLR表值函数示例(STVF / TVF)https://stackoverflow.com/questions/46729605
复制相似问题