2011-05-19 19 views
4

我有一个生成的SQL查询块,它将一个表值参数作为输入。如何为文本命令创建表值参数

我有一个DataTable data输入参数,则:

// add the table-value parameter 
var tvp = com.Parameters.AddWithValue("data", data); 
tvp.SqlDbType = SqlDbType.Structured; 
tvp.TypeName = "???"; 

com.ExecuteNonQuery(); 

的问题是,如果该命令不是一个存储过程然后到被宣布为TypeName需求。

参数data中的列的数量和类型可能会有很大差异,所以我没有可以使用的SQL类型。

有没有什么方法可以用这种方式使用TVP?

回答

3

您必须在服务器端有一个定义的TypeName才能传递一个表值参数。所以如果不存在,那么不......你不能以这种方式使用表值参数。了解更多关于限制和要求在这里:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

我还没有过尝试过,但不应该有任何理由,你不能生成之前,根据这个代码块的创建类型名声明你的数据表的结构。你可以选择你想要的任何名字,然后在完成时放下它。

根据datatable的结构构建create typename语句需要一些编码,但可以使用。

+2

是的,这是我走下的路线,但经过很多混乱之后,我发现它很慢。起初我认为这是由于动态创建类型,但所有TVP调用都很慢。它看起来就像在引擎盖下,TVP是用每行的'insert into'语句*构建的*。它更快速地(我们正在说几秒到几毫秒)动态构建自己的,甚至使用'SqlBulkCopy'。我认为.Net的TVP实现可能会被破坏,因为如果它使用''insert'来分隔值集合,那么它会更快。 – Keith 2011-05-19 22:24:16

+0

良好的信息,感谢张贴您的经验。你的问题引起了我的兴趣,而当我有机会看看我能否实现它时,我会试试它。 – RThomas 2011-05-19 23:47:18