[英]Is it possible to pass in an “outer” generic collection type into a class without specifying the inner type of the items that the collection contains?
[英]Is it possible to pass table parameter without specifying type?
ADO.NET SqlCommand
类具有用于执行批量插入的WriteToServer
方法 。
不幸的是,无法取回已生成列的值。 (告诉我,如果我错了)。
有一个想法在output
使用insert into
。
insert into MyTable(Column1,Column2,...)
output iserted.GeneratedColumn1, GeneratedColumn2, ...
select Column1,Column2,....
from @rows
其中@rows
应该是表值参数。 但是对于查询和SP表值参数都必须具有类型。
因此,我需要为每个插入的实体创建一个类型。
尽管可以在应用程序开始时生成类型,但是有一个技巧(我不知道)告诉服务器在处理查询时“发现”类型,就像在具体表中进行大容量插入时一样。
可能吗?
传递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 );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.