使用一个insert语句为多个值填充ado.net中的表值参数?

时间:2019-06-24 21:44:24

标签: c# sql sql-server ado.net

我有一些C#代码正在填充TVP,然后在SQL Server中调用存储过程,并在该存储过程中传递该TVP。它利用标准的ADO.NET数据表和Rows.Add来填充行。

运行sqlCommand.ExecuteNonQuery()时,如果在SQL事件探查器中捕获了SQL跟踪,则会看到类似的内容,它将在单独的插入语句中填充TVP的每一行。

declare @p1 dbo.BigIntTable -- This is a table type

insert into @p1 values(1)
insert into @p1 values(2)
insert into @p1 values(3)
insert into @p1 values(4)
insert into @p1 values(5)

exec dbo.MyProc @InputTVP=@p1
go

我希望它在一条语句中插入所有值,如下所示。下面的示例是有效的SQL,并且其性能比ADO.NET生成的SQL好得多。有什么想法吗?

declare @p1 dbo.BigIntTable -- This is a table type

insert into @p1 
values
 (1)
,(2)
,(3)
,(4)
,(5)

exec dbo.MyProc @InputTVP=@p1
go

1 个答案:

答案 0 :(得分:6)

Profiler不会向您显示客户端实际发送的内容,而是向您显示可以执行相同操作的一种TSQL复制批处理。

表值参数是feature of the TDS network protocol以及SQL Server数据库引擎。客户端将直接使用TDS发送数据,而不是在单独的INSERT语句中发送数据。

如果运行Profiler,则会看到没有单独的SQL:StmtCompleted事件可用于将每一行插入TVP。