如何从Ado.Net有效地调用表值参数

ado.net bulkinsert sqlbulkcopy sql-server sql-server-2008

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

因为现在我们可以使用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吗?它非常高效灵活。 是一个例子。

我提到它作为TVP的替代品。有关SQLBulkCopy与TVP相比的更多有趣信息,请参见此处此处

(从评论中复制)




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因