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

A-K*_*A-K 7 sql-server ado.net bulkinsert sqlbulkcopy 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;
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我认为它没有效率.我启动了Profiler,我立即看到Ado.Net发出以下效率极低的SQL被发送到服务器:

DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices
Run Code Online (Sandbox Code Playgroud)

结果,在发送,解析和编译时浪费了服务器上的大量网络带宽和CPU.有没有更有效的方法来使用Ado.Net的TVP?

Tim*_*ter 2

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

我提到它是 TVP 的替代方案。有关 SQLBulkCopy 与 TVP 相比的更多有趣信息,请参阅此处此处。

(从评论中复制)