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

时间:2011-06-10 21:31:32

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

我需要有效地提交从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?

1 个答案:

答案 0 :(得分:2)

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

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

(从评论中复制)