【问题标题】:How to efficiently invoke table-valued parameters from Ado.Net如何有效地从 Ado.Net 调用表值参数
【发布时间】:2011-09-12 19:49:40
【问题描述】:

我需要有效地将数以万计的数字和日期从 Ado.Net 提交到 SQl Server 2008。在 SQL 2008 之前的日子里,我将这些数字打包到一个图像中,这非常快。 Erland Sommarskog 非常友好地将我的一些代码包含在他的文章中Arrays and Lists in SQL Server 2005

因为现在我们可以使用 TVP,所以我尝试了它们。在客户端,我正在运行这个:

        dataTable = new DataTable();
        dataTable.Columns.Add("Date", typeof(DateTime));
        dataTable.Columns.Add("Price", typeof(decimal));
        dataTable.Rows.Add(new object[] { someDate, somePrice });
            command.CommandText = "Writers.SavePrices";
            command.CommandType = CommandType.StoredProcedure;
            var param = command.Parameters.AddWithValue("@Prices", dataTable);
            param.SqlDbType = SqlDbType.Structured;

此代码有效,但我认为它效率不高。我启动了 Profiler,我立即看到 Ado.Net 发出以下非常低效的 SQL 发送到服务器:

DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices

因此,服务器上的大量网络带宽和 CPU 浪费在发送、解析和编译上。有没有更有效的方法在 Ado.Net 中使用 TVP?

【问题讨论】:

  • 你知道SqlBulkCopy吗?它非常高效和灵活。 Here 就是一个例子。
  • @Tim:当然,我可以使用 SqlBulkCopy 将我的数据倒入临时表中。但是,我无法找到让 SqlBulkCopy 和 TVP 一起工作的方法。
  • 我提到它是 TVP 的替代品。请参阅herehere,了解有关 SQLBulkCopy 与 TVP 相比的更多有趣信息。
  • @Tim:您可以将您的评论复制到答案中,以便我接受吗?显然没有更好的办法。
  • ADO.NET 是否如this blog post 中所述发送数以万计的INSERT 语句(TVP 中的每一行一个INSERT)?

标签: sql-server sql-server-2008 ado.net bulkinsert sqlbulkcopy


【解决方案1】:

你知道SqlBulkCopy吗?它非常高效和灵活。 Here 就是一个例子。

我提到它是 TVP 的替代品。请参阅 herehere 以获取有关 SQLBulkCopy 与 TVP 相比的更多有趣信息。

(复制自 cmets)

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多