ADO.NET SqlCommand
班级有method WriteToServer
来执行批量插入。
不幸的是,没有办法找回生成列的值。 (告诉我,如果我错了)。
明智地将insert into
与output
一起使用。
insert into MyTable(Column1,Column2,...)
output iserted.GeneratedColumn1, GeneratedColumn2, ...
select Column1,Column2,....
from @rows
其中@rows
应该是表值参数。但是对于查询和SP表值参数都必须有一个类型
因此,我需要为每个插入的实体创建一个类型
虽然可以在应用程序的最开始生成类型,但是在处理查询时可能有一个技巧(我不知道)告诉服务器“发现”类型,就像在具体表中进行批量插入一样。
有可能吗?
答案 0 :(得分:1)
传递TVP需要在服务器上定义的表类型。完成任务的另一个选择是将行作为XML传递,然后使用INSERT ... OUTPUT ... SELECT。这可能不会像TVP那样表现出色,但是不需要服务器端类型定义,并且可能提供足够好的性能。
例如,给出下表:
CREATE TABLE dbo.table1
(
col1 int IDENTITY ,
col2 date ,
col3 varchar(10)
);
以下将完成这项工作。可以将xml作为参数传递,而不是像本示例中那样传递。
DECLARE @xml xml = '
<rows>
<row>
<col2>2014-01-03</col2>
<col3>test1</col3>
</row>
<row>
<col2>2014-10-20</col2>
<col3>test2</col3>
</row>
</rows>';
INSERT INTO dbo.table1
( col2 ,
col3
)
OUTPUT inserted.col1 ,
inserted.col2 ,
inserted.col3
SELECT rows.row.value('./col2[1]', 'date') AS PaymentDate ,
rows.row.value('./col3[1]', 'varchar(32)') AS PaidBy
FROM @xml.nodes('/rows/row') AS rows ( row );