在Ado.net中填充一个表值参数,其中一个插入语句用于多个值



我有一些C#代码,这些C#代码填充了TVP,然后在SQL Server中调用该过程中通过该TVP中的存储过程。它利用标准ado.net数据表和 Rows.Add填充行。

sqlCommand.ExecuteNonQuery()运行时,如果您在SQL Profiler中捕获SQL Trace,则会看到这样的东西,其中它将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生成的上述要好得多。有什么想法吗?

declare @p1 dbo.BigIntTable -- This is a table type
insert into @p1 
values
 (1)
,(2)
,(3)
,(4)
,(5)
exec dbo.MyProc @InputTVP=@p1
go

profiler不向您显示客户端实际发送的内容,而是一种tsql复制批次,您可以跑步去做同一件事。

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

如果您运行Profiler,您会发现没有单独的SQL:STMTCOMPLETED事件用于将每一行插入TVP。

最新更新