【问题标题】:Getting node value in xml column在 xml 列中获取节点值
【发布时间】:2017-05-29 03:50:26
【问题描述】:

请告诉我为什么以下 XML 查询未获取任何结果。 我正在尝试获取值 EffectiveUserName 标记。

DECLARE @MyXML XML
        SET @MyXML = '<PropertyList xmlns="urn:schemas-microsoft-com:xml-analysis" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <Catalog>name</Catalog>
      <Timeout>600</Timeout>
      <Format>Native</Format>
      <DbpropMsmdFlattened2>false</DbpropMsmdFlattened2>
      <Cube>Model</Cube>
      <DbpropMsmdOptimizeResponse>1</DbpropMsmdOptimizeResponse>
      <DbpropMsmdActivityID>68A6900B-20F8-4A02-AEC3-7C56B2D3C5D5</DbpropMsmdActivityID>
      <DbpropMsmdRequestID>A0D1E07F-AE29-4CCA-AEE4-3B79D97CA426</DbpropMsmdRequestID>
      <DbpropMsmdCurrentActivityID>68A6900B-20F8-4A02-AEC3-7C56B2D3C5D5</DbpropMsmdCurrentActivityID>
      <LocaleIdentifier>1033</LocaleIdentifier>
      <EffectiveUserName>userid@domainname.com</EffectiveUserName>
      <sspropinitappname>PowerBI</sspropinitappname>
    </PropertyList>'


    select  @MyXML.value('(/PropertyList/EffectiveUserName)[1]','varchar(max)')

【问题讨论】:

    标签: sql xml sql-server-2008 tsql


    【解决方案1】:

    您可以通过在标签名称前使用*: 来忽略命名空间:

    select  @MyXML.value('(/*:PropertyList/*:EffectiveUserName)[1]','varchar(max)')
    

    【讨论】:

    • 虽然这可行,但不应将其作为一般提示。一般来说,使用 XML 最好(最快和最安全),尽可能具体...
    【解决方案2】:

    您的 XML 有一个 默认命名空间,您必须尊重并包含​​在您的查询中!

    <PropertyList xmlns="urn:schemas-microsoft-com:xml-analysis"  
                  ***********************************************
                  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    

    使用此代码通过为您的查询定义 default XML 命名空间来获取您正在寻找的值:

    ;WITH XMLNAMESPACES(DEFAULT 'urn:schemas-microsoft-com:xml-analysis')
    SELECT
        @MyXML.value('(/PropertyList/EffectiveUserName)[1]', 'varchar(50)')
    

    【讨论】:

    • select @MyXML.value('(/*:PropertyList/*:EffectiveUserName)[1]','varchar(max)')
    • @ShivaKumar 您显然遵循了 Aducci 的建议,为命名空间使用通配符。没关系,但您应该知道,尽可能具体化会更好。请给我一个提示:如果其中一个答案解决了您的问题,请在答案的投票计数器下方勾选接受检查。这将 1) 将此问题标记为已解决 2) 更容易找到最佳解决方案 3) 向回答者支付积分 4) 向您支付积分。一旦您自己越过了 15 点边界,您还被要求对贡献进行投票。这是说谢谢的方式。干杯
    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多