如何使用SQL从变量中提取所有XML值

如何使用SQL从变量中提取所有XML值,sql,sql-server,Sql,Sql Server,下面是XML变量&我想提取数据中的所有值: DECLARE @Xml XML = '<MetaData type="Contracts"> <Data column="PositionName">Administrator- Contract Compl</Data> <Data column="PositionName">Administrator - Contract Compl</Data> <Data colu

下面是XML变量&我想提取数据中的所有值:

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 @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
我还将您的代码更改为“工作”。您已经两次提到该数据

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)

请使用此

    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
我还将您的代码更改为“工作”。您已经两次提到该数据

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)

我相信此查询满足您的要求:

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

问题是,使用
'Data[1]
将只返回索引位置1处的元素,但句点
'。
将返回所有值。另外,由于没有“MetaData/Data/Data[1]”节点,所以它的格式有点不正确(这就是为什么您以前得到了所有
NULL
值)。

我相信此查询满足您的要求:

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

问题是,使用
'Data[1]
将只返回索引位置1处的元素,但句点
'。
将返回所有值。另外,由于没有“MetaData/Data/Data[1]”节点,它的格式有点不正确(这就是为什么您以前得到了所有
NULL
值)。

我需要所有的数据值…不仅仅是第一个值…谢谢您希望这些数据值在单个列中。我需要所有的数据值…不仅仅是第一个值…谢谢您希望这些数据值在单个列中。