在 ado.net 中填充一个 table 值的参数,并为多个值使用一个插入语句?
Populate a table-valued parameter in ado.net with ONE insert statement for multiple values?
我有一些 C# 代码正在填充 TVP,然后调用 SQL 服务器中的存储过程,它在该 TVP 中传递。它利用标准 ADO.NET DataTable 和 Rows.Add
来填充行。
当 sqlCommand.ExecuteNonQuery()
运行时,如果您在 SQL Profiler 中捕获 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 生成的示例执行得更好。有什么想法吗?
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 复制批次。
Table-Valued参数是feature of the TDS network protocol,还有SQL服务器数据库引擎。客户端将使用 TDS 直接发送数据,而不是在单独的 INSERT 语句中。
如果您使用 运行 Profiler,您会发现没有单独的 SQL:StmtCompleted 事件用于将每一行插入 TVP。
我有一些 C# 代码正在填充 TVP,然后调用 SQL 服务器中的存储过程,它在该 TVP 中传递。它利用标准 ADO.NET DataTable 和 Rows.Add
来填充行。
当 sqlCommand.ExecuteNonQuery()
运行时,如果您在 SQL Profiler 中捕获 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 生成的示例执行得更好。有什么想法吗?
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 复制批次。
Table-Valued参数是feature of the TDS network protocol,还有SQL服务器数据库引擎。客户端将使用 TDS 直接发送数据,而不是在单独的 INSERT 语句中。
如果您使用 运行 Profiler,您会发现没有单独的 SQL:StmtCompleted 事件用于将每一行插入 TVP。