2017-05-31 139 views
0

有沒有辦法使用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支持來代替 - 是的,你絕對可以做到這一點,沒有問題 –

回答

1

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作爲更通用的項目 –

相關問題