【问题标题】:Query XML Data column using SQL and XML methods使用 SQL 和 XML 方法查询 XML 数据列
【发布时间】:2014-07-30 08:10:09
【问题描述】:

我正在对 SQL Server 2012 中的 XML 数据类型列执行查询。数据示例如下:

<ns:Resume xmlns:ns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume">
  <ns:Address>
    <ns:Addr.Type>Home</ns:Addr.Type>
    <ns:Addr.Street>567 3rd Ave</ns:Addr.Street>
    <ns:Addr.Location>
      <ns:Location>
        <ns:Loc.CountryRegion>US </ns:Loc.CountryRegion>
        <ns:Loc.State>MI </ns:Loc.State>
        <ns:Loc.City>Saginaw</ns:Loc.City>
      </ns:Location>
    </ns:Addr.Location>
    <ns:Addr.PostalCode>53900</ns:Addr.PostalCode>
  </ns:Address>
</ns:Resume>

我使用此 link 返回 First 一个姓氏,但现在我想返回来自芝加哥和所有简历中的不同州的所有候选人。

对于来自芝加哥的所有候选人,我使用以下代码,但它总是返回列的名称,尽管值存在。你能帮帮我吗?

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
SELECT 
JobCandidateID,
T.c.value('(ns:Name/ns:Name.First)[1]', 'nvarchar(100)') +N' '+
T.c.value('(ns:Name/ns:Name.Last)[1]', 'nvarchar(100)') as [First & Last Name],
T.c.value('(ns:Address/ns:Addr.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Address],
T.c.value('(ns:Employment/ns:Emp.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Employment]
FROM   
HumanResources.JobCandidate
CROSS APPLY
[Resume].nodes('/ns:Resume') AS T(c)
where [Resume].exist('/ns:Resume/ns:Address/ns:Addr.Location/ns:Location[ns:Loc.City="Chicago"]')=1;

【问题讨论】:

    标签: sql-server xml xml-namespaces cross-apply


    【解决方案1】:

    所有来自芝加哥的候选人:

    WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
    SELECT 
    JobCandidateID,
    T.c.value('(ns:Name/ns:Name.First)[1]', 'nvarchar(100)') +N' '+
    T.c.value('(ns:Name/ns:Name.Last)[1]', 'nvarchar(100)') as [First & Last Name],
    T.c.value('(ns:Address/ns:Addr.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Address],
    T.c.value('(ns:Employment/ns:Emp.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Employment]
    FROM   
    HumanResources.JobCandidate
    CROSS APPLY
    [Resume].nodes('/ns:Resume') AS T(c)
    where [Resume].exist('/ns:Resume/ns:Employment/ns:Emp.Location/ns:Location[ns:Loc.City="Chicago"]')=1;
    

    没有交叉应用:

    WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
    SELECT 
    JobCandidateID,
    Resume.value('(/ns:Resume/ns:Name/ns:Name.First)[1]', 'nvarchar(100)') +N' '+
    Resume.value('(/ns:Resume/ns:Name/ns:Name.Last)[1]', 'nvarchar(100)') as [First & Last Name],
    Resume.value('(/ns:Resume/ns:Address/ns:Addr.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Address],
    Resume.value('(/ns:Resume/ns:Employment/ns:Emp.Location/ns:Location/ns:Loc.City)[1]', 'nvarchar(100)') as [City Employment]
    FROM   
    HumanResources.JobCandidate
    where Resume.exist('/ns:Resume/ns:Employment/ns:Emp.Location/ns:Location[ns:Loc.City="Chicago"]')=1;
    

    对于所有简历中的不同状态:

    WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
    SELECT distinct
    Resume.value('(/ns:Resume/ns:Address/ns:Addr.Location/ns:Location/ns:Loc.State)[1]', 'nvarchar(100)') as [State]
    FROM   
    HumanResources.JobCandidate
    

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多