Как перебрать все строки переменной xml - PullRequest
1 голос
/ 05 апреля 2011

У меня есть переменная xml, как

declare @xmlvar xml
create table tempxml(col1 xml)
insert into tempxml
exec someproc

select * from tempxml

После этого кода tempxml содержит данные:

<row eid="1" ename="jason" />
<row eid="2" ename="mike" />
<row eid="3" ename="ron" />

Теперь я хочу повторить цикл и извлечь eid для каждой строки, и мне нужно вызвать хранимую процедуру с eid в качестве параметра. То есть Мне нужно сделать что-то вроде этого

// Dummy code
While eid is not null
 // fetch eid from xml 
 exec somesp @eid = eid
Next

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011
declare @xml xml = 
'<row eid="1" ename="jason" />
 <row eid="2" ename="mike" />
 <row eid="3" ename="ron" />'

-- @T table to hold the eid's from the xml
declare @T table (ID int identity, eid int)

insert into @T
select
  r.value('@eid', 'int')
from @xml.nodes('row') n(r) 

declare @eid int
declare @CurrentID int = 1

-- Fetch first eid
select @eid = eid
from @T
where ID = @CurrentID

while @@rowcount = 1
begin
  --exec SP with @eid here

  --Fetch next eid
  set @CurrentID = @CurrentID + 1

  select @eid = eid
  from @T
  where ID = @CurrentID
end 
1 голос
/ 05 апреля 2011

Вы можете попробовать что-то вроде этого:

-- declare table variable
DECLARE @EIDTable TABLE (RowEID INT)

-- fill table variable from XML variable
INSERT INTO @EIDTable(RowEID)
    SELECT
         row.value('(@eid)[1]', 'int')
    from 
         @xmlvar.nodes('/row') AS XmlRow(ROW)

-- declare single EID to process            
DECLARE @EID INT

-- fill single EID    
SELECT TOP  1 @EID = RowEID FROM @inputtable

-- loop while not NULL
WHILE @eid IS NOT NULL
BEGIN
    -- execute your stored procedure here with @eid as a parameter

    -- remove that EID that's been processed
    DELETE FROM @inputtable
    WHERE RowEID = @eid

    -- grab next EID from temporary table variable and loop    
    SET @EID = NULL
    SELECT TOP  1 @EID = RowEID FROM @inputtable
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...