2015-12-12 2 views
2

У меня есть XML столбец в таблице со следующей структуройSQL Server дает мне ошибку одноплодной

<md xmlns="http://www.intellipayment.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <dist> 
    <ml> 
     <S>368.72</S> 
     <src>26249201</src> 
     <t>26249202</t> 
    </ml> 
    <ml> 
    .... 
    </ml> 
    </dist> 
</md> 

Я хотел бы, чтобы выбрать все SRC и выполнять операции по одному.

Так что мой SQL заявление:

while @i <= @xmlCount 
begin 
    select 
     @CurrentSrc = AssignmentDistribution.value('(/*:md/*:dist/*:ml/*:src/text())[sql:variable("@i")]', 'varchar(50)') 
    from 
     table 
    where 
     id = 1234 

    set @i = @i + 1 
end 

Я получаю эту ошибку:

XQuery [autodeals.AssignmentDistribution.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

Однако, если заменить переменную SQL со статическим номером 1, 2,3,4 .. ... он правильно покажет мне результат.

Может кто-нибудь, пожалуйста, скажите мне, что я сделал не так?

Благодаря

ответ

2

Это возможно потому, что sql:variable() возвращается xdt:anyAtomicType, я не уверен. Но это одна из возможных альтернатив, с помощью query() первого, который не применять никаких ограничений на возвращение только одиночки, а затем преобразовать возвращаемое значение varchar(50) с помощью value() функции:

select @CurrentSrc = AssignmentDistribution 
         .query('(/*:md/*:dist/*:ml/*:src/text())[sql:variable("@i")]') 
         .value('.', 'varchar(50)') 
FROM table where id = 1234 
1

Если вы используете этот подход с .nodes() вызова, Вам не нужно вручную делать какое-либо зацикливание - вы получите ваше src значения как хорошие, реляционный набор данных, и вы можете работать на них .....

;WITH XMLNAMESPACES(DEFAULT 'http://www.intellipayment.com'), 
SrcFromXml AS 
(
    SELECT 
     Id, 
     Src = XC.value('(src)[1]', 'int') 
    FROM 
     table 
    CROSS APPLY 
     AssignmentDistribution.nodes('/md/dist/ml') AS XT(XC) 
) 
SELECT * 
FROM SrcFromXml 
+0

Спасибо за ваш ответ. Я знаю это решение, но меня больше интересует, почему он дает мне ошибку. –

+0

@KennethLam: одна ** большая ** причина в том, что вы полностью игнорируете ** пространство имен XML ** в документе, и вы пытаетесь выбрать так, как будто в игре нет пространства имен XML. –

+0

пространство имен не является проблемой. Я выясняю, как выбрать переменную sql без определения пространства имен. –

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