TSQL-XML 메타데이터 분석 및 동적으로

0

질문

배경 나 XML 열에 SQL 테이블(를 사용하여 SQL Server). 각 노드가 다른 양의 메타데이터가 포함되어 있습니다. 예를 들어,아래의 예에서,단계 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 NULL NULL 단계 1 번호
2 NULL 6000 2 단계
3 5 NULL 단계 3 번호

하지만 명시적으로 호출하여 각각의 가치와 열을 만들에서는 이 방법이지 않는 확장성을 보장할 수 있습니다. 어떤 도움을 감사하겠습니다. 나는 비교적 새로운 종류의 데이터 은폐에서 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ý
..................................................................................................................