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

Ada*_*bur 1 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
Run Code Online (Sandbox Code Playgroud)

我希望它在一条语句中插入所有值,如下所示。下面的示例是有效的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
Run Code Online (Sandbox Code Playgroud)

Dav*_*oft 6

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

表值参数是TDS网络协议以及SQL Server数据库引擎的功能。客户端将直接使用TDS发送数据,而不是在单独的INSERT语句中发送数据。

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