簡體   English   中英

如何使用SQL從變量中提取所有XML值

[英]How do I Extract All The XML Values from a Variable using SQL

我下面有XML變量,我想提取DATA中的所有值:

DECLARE @Xml XML = '<MetaData type="Contracts">
  <Data column="PositionName">Administrator- Contract Compl</Data>
  <Data column="PositionName">Administrator - Contract Compl</Data>
  <Data column="PositionName">Dir - Contract Adm &amp; Analytics</Data>
  <Data column="PositionName">Director - Commercial Support</Data>
  <Data column="PositionName">Lead Contract Admin - Compl</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Assoc- Contract Admin</Data>
  <Data column="PositionName">Contract Administrator</Data>
  <Data column="PositionName">Director- Contract Admin</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Manager- Contract Admin</Data>
  <Data column="PositionName">Manager - Contract Admin</Data>
  <Data column="PositionName">Rep - NGL Distribution</Data>
  <Data column="PositionName">Supervisor- Contract Admin</Data>
  <Data column="PositionName">VP- Contract Administration</Data>
  <Data column="PositionName">Associate Contract Admin</Data>
  <Data column="PositionName">Sr Manager - Contract Admin</Data>
  <Data column="PositionName">Sr Specialist - Producer Svcs</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">VP - Contract Administration</Data>
</MetaData>';

-這失敗了

SELECT
    x.v.value('Data[1]','VARCHAR(100)')
FROM @Xml.nodes('MetaData/Data') x(v)

我相信此查詢可以滿足您的要求:

SELECT
    x.v.value('.','VARCHAR(100)')
FROM @Xml.nodes('MetaData/Data') x(v)

問題是使用'Data[1]'將僅返回索引位置1處的元素,但返回'.' 將返回所有值。 另外,由於沒有“ MetaData / Data / Data [1]”節點,它的格式也有些不正確(這就是為什么以前獲得所有NULL值的原因)。

請用這個

    DECLARE @Xml XML = '<MetaData type="Contracts">
  <Data column="PositionName">Administrator- Contract Compl</Data>
  <Data column="PositionName">Administrator - Contract Compl</Data>
  <Data column="PositionName">Dir - Contract Adm &amp; Analytics</Data>
  <Data column="PositionName">Director - Commercial Support</Data>
  <Data column="PositionName">Lead Contract Admin - Compl</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Assoc- Contract Admin</Data>
  <Data column="PositionName">Contract Administrator</Data>
  <Data column="PositionName">Director- Contract Admin</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Manager- Contract Admin</Data>
  <Data column="PositionName">Manager - Contract Admin</Data>
  <Data column="PositionName">Rep - NGL Distribution</Data>
  <Data column="PositionName">Supervisor- Contract Admin</Data>
  <Data column="PositionName">VP- Contract Administration</Data>
  <Data column="PositionName">Associate Contract Admin</Data>
  <Data column="PositionName">Sr Manager - Contract Admin</Data>
  <Data column="PositionName">Sr Specialist - Producer Svcs</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">VP - Contract Administration</Data>
</MetaData>'
DECLARE @m TABLE  (Xmls XML)
INSERT INTO @m SELECT @XML 
;WITH CTE AS
(
    SELECT
           p.value(N'.',N'nvarchar(MAX)') AS [Id]             
    FROM @m as x
    OUTER APPLY x.Xmls.nodes(N'/MetaData/Data') AS u(p)        
)
SELECT *
FROM CTE

輸出值

Id
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Administrator- Contract Compl
Administrator - Contract Compl
Dir - Contract Adm & Analytics
Director - Commercial Support
Lead Contract Admin - Compl
Lead Contract Administrator
Assoc- Contract Admin
Contract Administrator
Director- Contract Admin
Lead Contract Administrator
Manager- Contract Admin
Manager - Contract Admin
Rep - NGL Distribution
Supervisor- Contract Admin
VP- Contract Administration
Associate Contract Admin
Sr Manager - Contract Admin
Sr Specialist - Producer Svcs
Supervisor - Contract Admin
Supervisor - Contract Admin
VP - Contract Administration

(21 rows affected)

我也將您的代碼更改為可以工作。 您已經兩次提到數據

DECLARE @Xml XML = '<MetaData type="Contracts">
  <Data column="PositionName">Administrator- Contract Compl</Data>
  <Data column="PositionName">Administrator - Contract Compl</Data>
  <Data column="PositionName">Dir - Contract Adm &amp; Analytics</Data>
  <Data column="PositionName">Director - Commercial Support</Data>
  <Data column="PositionName">Lead Contract Admin - Compl</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Assoc- Contract Admin</Data>
  <Data column="PositionName">Contract Administrator</Data>
  <Data column="PositionName">Director- Contract Admin</Data>
  <Data column="PositionName">Lead Contract Administrator</Data>
  <Data column="PositionName">Manager- Contract Admin</Data>
  <Data column="PositionName">Manager - Contract Admin</Data>
  <Data column="PositionName">Rep - NGL Distribution</Data>
  <Data column="PositionName">Supervisor- Contract Admin</Data>
  <Data column="PositionName">VP- Contract Administration</Data>
  <Data column="PositionName">Associate Contract Admin</Data>
  <Data column="PositionName">Sr Manager - Contract Admin</Data>
  <Data column="PositionName">Sr Specialist - Producer Svcs</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">Supervisor - Contract Admin</Data>
  <Data column="PositionName">VP - Contract Administration</Data>
</MetaData>'
SELECT
    x.v.value('.','VARCHAR(100)')
FROM @Xml.nodes('/MetaData/Data') x(v)

輸出值

----------------------------------------------------------------------------------------------------
Administrator- Contract Compl
Administrator - Contract Compl
Dir - Contract Adm & Analytics
Director - Commercial Support
Lead Contract Admin - Compl
Lead Contract Administrator
Assoc- Contract Admin
Contract Administrator
Director- Contract Admin
Lead Contract Administrator
Manager- Contract Admin
Manager - Contract Admin
Rep - NGL Distribution
Supervisor- Contract Admin
VP- Contract Administration
Associate Contract Admin
Sr Manager - Contract Admin
Sr Specialist - Producer Svcs
Supervisor - Contract Admin
Supervisor - Contract Admin
VP - Contract Administration

(21 rows affected)

暫無
暫無

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

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