繁体   English   中英

是否可以在不指定类型的情况下传递表参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM