سؤال

لدي هذا XML في T-SQL:

<Elements>
    <Element>
        <Index>1</Index>
        <Type>A</Type>
        <Code>AB</Code>
        <Time>1900-01-01T10:21:00</Time>
    </Element>
    <Element>
        <Index>2</Index>
        <Type>M</Type>
        <Code>AL</Code>
        <Time>1900-01-01T10:22:00</Time>
    </Element>
</Elements>

وأريد استرداده كجدول:

Index    FieldName    FieldValue
-------- ------------ ----------
1        Index        1
1        Type         A
1        Code         AB
1        Time         1900-01-01T10:21:00
2        Index        2
2        Type         M
2        Code         AL
2        Time         1900-01-01T10:22:00

بالطبع ، ما أبحث عنه هنا هو محور العقد العناصر في صفوف ، لكن لا يمكنني الحصول على أكثر من مجرد قيمة الحقل أو الفهرس في وقت واحد ...

select
--  r.value('.[1]', 'nvarchar(10)') Value,
--  r.value('fn:local-name(.)', 'nvarchar(50)') FieldName
    r.value('Index[1]', 'nvarchar(10)') f,
    r.value('./node()[fn:local-name(.)]', 'nvarchar(10)') v
from
    @content.nodes('/Elements/*') as records(r)
هل كانت مفيدة؟

المحلول

يمكنك تجربة شيء مثل هذا:

SELECT
    El.Elem.value('(Index)[1]', 'int'),
    SubEl.SubElem.value('local-name(.)', 'varchar(100)') AS 'Field Name',
    SubEl.SubElem.value('.', 'varchar(100)') AS 'Field Value'
FROM
    @content.nodes('/Elements/Element') AS El(elem)
CROSS APPLY
    El.Elem.nodes('*') AS SubEl(SubElem)

يبدو أن هذا ينتج الإخراج المطلوب في حالة الاختبار الخاصة بي.

تحتاج أساسا لتحديد كل شيء /Elements/Element العقد في الخطوة الأولى ، والحصول على قيمة الفهرس الخاصة بهم ، ثم في خطوة ثانية ، حدد جميع العقد الفرعية (/*) لأي معين <Element> العقدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top