我有一些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
答案 0 :(得分:6)
Profiler不会向您显示客户端实际发送的内容,而是向您显示可以执行相同操作的一种TSQL复制批处理。
表值参数是feature of the TDS network protocol以及SQL Server数据库引擎。客户端将直接使用TDS发送数据,而不是在单独的INSERT语句中发送数据。
如果运行Profiler,则会看到没有单独的SQL:StmtCompleted事件可用于将每一行插入TVP。