【问题标题】:SqlBulkCopy in SQLCLR stored procedure?SQLCLR 存储过程中的 SqlBulkCopy?
【发布时间】:2013-02-10 22:32:10
【问题描述】:

我创建了从外部服务检索大量数据的 SQLCLR 存储过程。 我可以将数据批量复制到同一个 SQLCLR 存储过程中的新表中吗?

【问题讨论】:

    标签: c# .net sql sqlclr


    【解决方案1】:

    我将在这里缩小讨论如何在 SQL 中从服务中公开数据的一般问题。可以做的是将您的存储过程重写为流式传输结果的Table Valued CLR function。然后你可以这样使用:

    insert into MyTable(id, name)
    select id, name from dbo.MyTableFunc(agrs) 
    

    对此的基础架构进行了很好的优化,我使用了它,当我停止优化时,它很快就能达到每秒 3k 行,而瓶颈在于通过网络获取行。

    将服务公开为函数的好处是您也可以直接在查询和连接中使用它,无需先将其存储到磁盘上的表中(对于慢速磁盘、事务日志、锁定 yadayada 的额外步骤)。它也会优雅地取消,您可以执行top 100 等操作。

    如果您告诉我们更多/提供一些代码,我们可以提供更多帮助。

    【讨论】:

    • 实际上,出于与您提到的相同原因,我的第一次尝试是使用 CLR table-UDF。但是我遇到了一个问题,我需要仅投影某些列的能力,并且 UDF 具有预定义的模式。因此,我尝试使用返回键列和 XML 列的 UDF 来解决它,该列包含我想要投影的其他列。但是由于 xml 序列化,它使 sqlclr 变得非常慢,所以我将其更改为使用存储过程。现在,我正在使用没有 sqlbulkcopy(简单事务)的存储过程,它工作得相当好,但对于 1m+ 行可能会出现问题。
    猜你喜欢
    • 2014-08-09
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多