如何使用一个插入语句为ADO.NET中的表值参数填充多个值?

3
我有一些C#代码,用来填充TVP并调用SQL Server中的存储过程,将其传递给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生成的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

你尝试过使用IEnumerable方法吗? - Dale K
你能考虑使用 JSON 或 XML 替代 TVP 吗? - Piotr Palka
请记住,在 INSERT ... VALUES 语句中使用的是 VALUES,每次最多只能插入1000行。 - Piotr Palka
1个回答

9

性能分析工具(Profiler)会显示给你一个类似于TSQL复制批处理的内容,而不是客户端实际发送的内容。

表值参数(Table-Valued Parameters)是TDS网络协议和SQL Server数据库引擎的一个特性。客户端会直接使用TDS发送数据,而不是单独的INSERT语句。

如果你运行性能分析工具,你将看到没有单独的SQL:StmtCompleted事件来将每行插入到TVP中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接