TSQL - पार्स XML मेटाडाटा और मूल्यों के लिए गतिशील रूप से

0

सवाल

पृष्ठभूमि मैं एक XML स्तंभ में SQL तालिका (SQL सर्वर का उपयोग). प्रत्येक नोड एक अलग राशि मेटाडाटा के. उदाहरण के लिए, नीचे दिए गए उदाहरण में, कदम नंबर 1 है केवल "नहीं" के रूप में मेटाडाटा, जबकि, कदम नंबर 2 इसके अतिरिक्त है RBuffer.

<Step No="1" >Step Number 1</Step>
<Step No="2" RBuffer="6000">Step Number 2</Step>
<Step No="3" Macro="5">Step Number 3</Step>

उम्मीद उत्पादन

मैं करना चाहते हैं निकालने के लिए इस मेटाडाटा गतिशील रूप से जब भी हथियाने के मूल्य. के लिए ऊपर के उदाहरण में, इस तरह लग रही होगी तालिका के नीचे । महत्वपूर्ण बात है, यह बात नहीं करनी चाहिए कि कैसे कई मेटाडाटा टैग कर रहे हैं, मैं यह चाहते हैं जाने के लिए उन सभी के माध्यम से. मेरे कुछ डेटा है 10+ टैग.

नोड कदम कुंजी मूल्य
कदम 1 मूल्य कदम नंबर 1
कदम 2 RBuffer 6000
कदम 2 मूल्य कदम नंबर 2
कदम 3 मैक्रो 5
कदम 3 मूल्य कदम नंबर 3

अब तक काम

अब तक, मैं सक्षम किया गया है निकालने के लिए मेटाडाटा में एक स्थिर तरीके:

SELECT o.value('@No', 'varchar(32)') [Step]
      ,o.value('@Macro', 'varchar(32)') [Macro]
      ,o.value('@RBuffer', 'varchar(32)') [RBuffer]
      ,o.value('(text())[1]', 'varchar(32)') [Action]
  FROM [dbo].[dw_mrd_vss_rundetail_stg] S
    CROSS APPLY S.[rundata_detail].nodes('Step') xmlData(o)

देता है, जो निम्न तालिका:

कदम मैक्रो RBuffer कार्रवाई
1 अशक्त अशक्त कदम नंबर 1
2 अशक्त 6000 कदम नंबर 2
3 5 अशक्त कदम नंबर 3

लेकिन मैं करने के लिए स्पष्ट रूप से प्रत्येक कॉल के मूल्य और बनाने के कॉलम में इस तरह से नहीं स्केलेबल. किसी भी मदद की सराहना की जाएगी. मैं अपेक्षाकृत नया हूँ के लिए इस तरह के munging डेटा SQL में है, तो स्पष्टीकरण के कोड उपयोगी हो जाएगा ।

sql sql-server tsql xquery
2021-11-23 17:24:48
2

सबसे अच्छा जवाब

1

एक गतिशील समाधान है । यदि "नहीं" विशेषता वैकल्पिक है और एक नोड नाम अलग-अलग है के रूप में अच्छी तरह से,

Declare @xml Xml = '<doc>
  <Step No="1" >Step Number 1</Step>
  <Step No="2" RBuffer="6000">Step Number 2</Step>
  <Step No="3" Macro="5">Step Number 3</Step>
  <Step Macro="7">Step Number 4</Step>
  <Node No="5">Step Number 5</Node>
</doc>';

select x.*
from @xml.nodes('/doc/*') d(dn)
cross apply (
  -- element data and "No" attr 
  select n.value('local-name(.)', 'varchar(32)') [node], 'Value' [Key], n.value('@No', 'varchar(32)') [Step], n.value('(text())[1]', 'varchar(32)') [Value]
  from d.dn.nodes('.') s(n)
  union all
  -- attributes data but "No"
  select n.value('local-name(../.)', 'varchar(32)') [node], n.value('local-name(.)', 'varchar(32)') [Key], n.value('../@No', 'varchar(32)') [Step], n.value ('data(.)', 'varchar(32)') [Value]
  from d.dn.nodes('./@*[local-name(.)!="No"]') a(n)
) x

रिटर्न

node    Key Step    Value
Step    Value   1   Step Number 1
Step    Value   2   Step Number 2
Step    RBuffer 2   6000
Step    Value   3   Step Number 3
Step    Macro   3   5
Step    Value       Step Number 4
Step    Macro       7
Node    Value   5   Step Number 5
2021-11-23 18:58:17
1

आप कर सकते हैं OUTER APPLY एक अनुक्रम युक्त गुण और भीतरी पाठ. फिर उन में से प्रत्येक के, आप का उपयोग कर सकते हैं local-name(.) नाम पाने के लिए की एक विशेषता है ।

SELECT
  Node  = x1.step.value('local-name(.)','varchar(20)'),
  Step  = x1.step.value('@No','int'),
  [Key] = x2.vals.value('if (local-name(.) = "") then "Value" else local-name(.)','varchar(20)'),
  Value = x2.vals.value('.','nvarchar(100)')
FROM dw_mrd_vss_rundetail_stg s
CROSS APPLY s.rundata_detail.nodes('/Step') x1(step)
OUTER APPLY x1.step.nodes('(./@*[local-name(.) != "No"], ./text())') x2(vals);

db<>बेला

यदि आप चाहते हैं को शामिल करने के लिए सभी नोड्स के लिए, यहां तक कि लोगों को नहीं कर रहे हैं कि Step, बस बदलने के लिए पहले .nodes करने के लिए .nodes('/*')

2021-11-23 23:11:26

..कदम तत्वों के बिना पाठ (नोड) और कोई अन्य विशेषता है (लेकिन नहीं) शामिल नहीं किया जाएगा
lptr

@lptr आप कर रहे हैं, सही होने की जरूरत है OUTER APPLY
Charlieface

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में