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

时间:2014-09-30 16:07:55

标签: c# sql sql-server ado.net

ADO.NET SqlCommand班级有method WriteToServer来执行批量插入。

不幸的是,没有办法找回生成列的值。 (告诉我,如果我错了)。

明智地将insert intooutput一起使用。

insert into MyTable(Column1,Column2,...)
output iserted.GeneratedColumn1, GeneratedColumn2, ...
select Column1,Column2,....
from @rows

其中@rows应该是表值参数。但是对于查询和SP表值参数都必须有一个类型 因此,我需要为每个插入的实体创建一个类型 虽然可以在应用程序的最开始生成类型,但是在处理查询时可能有一个技巧(我不知道)告诉服务器“发现”类型,就像在具体表中进行批量插入一样。

有可能吗?

1 个答案:

答案 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 );