使用OpenXML将多个参数传递给SQL Server存储过程

使用OpenXML将多个参数传递给SQL Server存储过程

问题描述:

有没有办法使用OpenXML和SQL Server存储过程在不使用临时表的情况下传递多个参数(这实际上减慢了我们的速度?)?使用OpenXML将多个参数传递给SQL Server存储过程

例如,一个参数:

exec usp_FooBar 
'<Data><States><State StateID="16" StateName="Massachusetts" "/></States></Data>' 

usp_FooBar我会得到通过

Declare @StateID int 
. 
. 
. 

SELECT @StateID = StateID FROM 
    OPENXML(@IDOC,'/Data/States/State',1) 
    WITH  
    (  
    StateID INT  
) 

然而​​价值,可以说,我想在多个国家经过:

exec usp_FooBar 
'<Data><States><State StateID="16" StateName="Massachusetts" "/><State StateID="87" StateName="Minnesota" /></States></Data>' 

有什么办法可以做类似于s单一的状态场景,我可以接受任意数量的参数,而不使用临时表(正如我所提到的那样,对我来说已经对性能产生了重大影响)?

+0

我认为临时表是最快的方法,这里是所有解决方案的好文章:http://www.sommarskog.se /share_data.html –

+0

我会推荐沟渠'OpenXML'并使用** native ** XQuery支持来代替 - 是的,你绝对可以做到这一点,没有问题 –

Declare @XML xml = ' 
<Data> 
    <States> 
     <State StateID="16" StateName="Massachusetts" /> 
     <State StateID="25" StateName="New York" /> 
     <State StateID="13" StateName="Rhode Island" /> 
    </States> 
</Data> 
' 


Select Grp = r.value('@StateID','int') 
     ,Item = attr.value('local-name(.)','varchar(100)') 
     ,Value = attr.value('.','varchar(max)') 
From @XML.nodes('/Data/States/State') as A(r) 
Cross Apply A.r.nodes('./@*') AS B(attr) 

返回

Grp Item  Value 
16 StateID  16 
16 StateName Massachusetts 
25 StateID  25 
25 StateName New York 
13 StateID  13 
13 StateName Rhode Island 
+0

你的例子如何工作才智h多个州? –

+0

@Amanda_Panda有一刻,我会更新我的回答 –

+0

@Amanda_Panda对不起,有一个快速的电话。我添加了一个GRP列来隔离节点。这可以是row_number作为更通用的项目 –