2010-08-20 3 views
0

Я пытаюсь выяснить, как я могу загрузить свою переменную таблицы с данными из XML с помощью динамического xquery? Я получаю результирующий набор узлов из запроса и определяю тип значения этих узлов. Похоже, что это определение значений узлов, которые он взорвает.T-SQL Dynamic xquery

Вот пример скрипта, который работает, но не является динамическим.

Сценарий:

DECLARE @XML XML = '<root> 
         <data> 
         <list id="organization" label="Organization"> 
            <options> 
            <item value="1" label="Organization1" selected="false" /> 
            <item value="2" label="Organization2" selected="false" /> 
            <item value="3" label="Organization3" selected="false" /> 
            <item value="4" label="Organization4" selected="true" /> 
            <item value="5" label="Organization5" selected="true" /> 
            </options> 
          </list> 
         </data> 
        </root>'; 


DECLARE @Orgs  TABLE (ID INT); 

Insert Into @Orgs(ID) Select OrgNameIdNodes.ID.value('@value','int') from @xml.nodes('//*[@id="organization"]//item[@selected="true"]') as OrgNameIdNodes(ID); 

Select * 
from @orgs 

То, что я хотел бы быть в состоянии сделать, это передать в параметрах как значение и секций @ xml.nodes, так что я бы что-то вроде:

Insert Into @Orgs(ID) Select OrgNameIdNodes.ID.value(@Value) from @xml.nodes(@Nodes) as  OrgNameIdNodes(ID); 

Это возможно?

ответ

2

Как об использовании sp_executesql с динамическим sql. Что-то вроде:

DECLARE @XML XML = '<root> 
         <data> 
         <list id="organization" label="Organization"> 
            <options> 
            <item value="1" label="Organization1" selected="false" /> 
            <item value="2" label="Organization2" selected="false" /> 
            <item value="3" label="Organization3" selected="false" /> 
            <item value="4" label="Organization4" selected="true" /> 
            <item value="5" label="Organization5" selected="true" /> 
            </options> 
          </list> 
         </data> 
        </root>'; 

declare @orgs table(ID int); 

declare @nodes nvarchar(4000), 
     @value nvarchar(4000), 
     @query nvarchar(4000) 

select @value = '''@value'',''int''' 
select @nodes = '//*[@id="organization"]//item[@selected="true"]' 

select @query = 'Select OrgNameIdNodes.ID.value(' + @value + ') ' + 
       'from @xml.nodes(''' + @nodes + ''') as OrgNameIdNodes(ID)' 

insert into @Orgs(ID) EXEC sp_executesql @query, N'@xml xml', @xml = @xml 

Select * 
from @orgs 
+0

Прекрасное спасибо Гаретт – scarpacci

Смежные вопросы