簡體   English   中英

從 sql server 的值中選擇 nvarchar(max) xml

[英]Select nvarchar(max) xml fromat values from sql server

我有以下 XML:

<Attributes>
  <Map>
    <entry key="approvalSet">
      <value>
        <Approval>
          <ApprovalItem application="SP" id="9659102e" name="reporting_queue" operation="Add" />
          <ApprovalItem application="SP" id="1013b3f5" name="reporting_queue" operation="Add" />
          <ApprovalItem application="SP" id="09648f81" name="reporting_queue" operation="Add" />
        </Approval>
      </value>
    </entry>
    <entry key="DisplayName" value=" mike " />
    <entry key="Name" value="1222" />
    <entry key="policy" />
    <entry key="work">
      <value>
        <WorkLevel>Normal</WorkLevel>
      </value>
    </entry>
  </Map>
</Attributes>

我想運行一個選擇 sql,其中一個列(屬性)具有 xml 格式(附在此處)。 sql 是這樣的:

SELECT 
    w.created,
    W.[attributes],
    W.[completer]
FROM [item_archive] W 
WHERE W.type='Manual'

如何從具有 XML 格式的屬性列中分別獲取記錄值的結果作為新列( applicationidnameoperation )值。 XML 列類型為nvarchar((max),null)

像這樣:

    drop table if exists #item_archive 
    create table #item_archive
    ( 
      created datetime,
      attributes varchar(max) null,
      completer varchar(20),
      type varchar(20)
    )

    declare @d varchar(max) = '
<Attributes>
  <Map>
    <entry key="approvalSet">
      <value>
        <Approval>
          <ApprovalItem application="SP" id="9659102e" name="reporting_queue" operation="Add" />
          <ApprovalItem application="SP" id="1013b3f5" name="reporting_queue" operation="Add" />
          <ApprovalItem application="SP" id="09648f81" name="reporting_queue" operation="Add" />
        </Approval>
      </value>
    </entry>
    <entry key="DisplayName" value=" mike " />
    <entry key="Name" value="1222" />
    <entry key="policy" />
    <entry key="work">
      <value>
        <WorkLevel>Normal</WorkLevel>
      </value>
    </entry>
  </Map>
</Attributes>'

    insert into #item_archive(created,attributes,completer,type)
    values (getdate(),@d,'joe','Manual')

    go

    with W as 
    (
      select *, cast(attributes as xml) attributes_xml
      from #item_archive
    )
    select 
        w.created,
        w.completer,
        A.ApprovalItem.value('@application','varchar(20)') application,
        A.ApprovalItem.value('@id','varchar(20)') id,
        A.ApprovalItem.value('@name','varchar(50)') name,
        A.ApprovalItem.value('@operation','varchar(20)') operation
    from  W
    cross apply W.attributes_xml.nodes('/Attributes/Map/entry[@key="approvalSet"]/value/Approval/ApprovalItem') A(approvalItem)
    where W.type = 'Manual'

產出

created                 completer            application          id                   name                                               operation
----------------------- -------------------- -------------------- -------------------- -------------------------------------------------- --------------------
2018-12-04 16:41:03.550 joe                  SP                   9659102e             reporting_queue                                    Add
2018-12-04 16:41:03.550 joe                  SP                   1013b3f5             reporting_queue                                    Add
2018-12-04 16:41:03.550 joe                  SP                   09648f81             reporting_queue                                    Add

(3 rows affected)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM