是否有一种优雅的交叉实现方式来保存多个记录而不是专门的解析?

时间:2013-08-01 14:21:59

标签: sql sql-server

我正在设想一些东西,比如获取一个对象集合并以一种集合映射到TABLE参数或其他东西的方式发送到存储过程。这样的事情存在吗?

实施明智我们使用SQL Server 2008,但我想坚持一般支持的方法[尽可能阅读接近多个供应商兼容]。我意识到我可以做一些专门的解析,并且实际上我也不需要优化它(即我可以一次只保存一条记录),但我想知道是否有一般的最佳实践方法来保存多个通过存储过程记录?

1 个答案:

答案 0 :(得分:0)

一般来说,我知道有两种方法,遗憾的是它们都没有交叉实施。

xml参数

create procedure sp_test1
(
    @Data xml
)
as
begin
  select
      D.r.value('@ID', 'nvarchar(128)') as ID,
      D.r.value('@Name', 'nvarchar(128)') as Name
  from @Data.nodes('Data/row') as D(r)
end;

declare @Data xml

select @Data = (select * from test for xml raw('row'), root('Data'))

exec dbo.sp_test1
    @Data = @Data;

表格变量

create procedure sp_test2
(
    @tData tbl_test readonly
)
as
begin
  select * 
  from @tData
end

declare @tData tbl_test

insert into @tData
select * from test

exec dbo.sp_test2
    @tData = @tData;

请参阅SQL FIDDLE EXAMPLE

如果你问我,我建议使用xml:

  • 您不仅可以将xml用于表格数据,还可以嵌套到
  • 您不必为要使用其他架构的每种类型定义类型
  • 据我记忆,一旦你创建了一个类型,你就无法改变它,如果有一个使用它的对象你就不能放弃它,所以它不是很容易维护

我也必须警告你,从我的经验来看,对于大量的记录来说,xml可能不会那么快。