【问题标题】:XML Field - QueryXML 字段 - 查询
【发布时间】:2012-05-09 18:59:06
【问题描述】:

我无法构建正确的语法以在我的 sql sever 2008 上执行与 XML 字段相关的任何查询。

我有一个简单的表,其中包含 Idproduct、ProductName 和 XmlProduct 等字段。 ..XmlProduct 字段如下所示:

<DynamicProfile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WinTest">
  <AllData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:KeyValueOfstringstring>
      <d2p1:Key>MyFirstKey</d2p1:Key>
      <d2p1:Value>MyFirstValue</d2p1:Value>
    </d2p1:KeyValueOfstringstring>
    <d2p1:KeyValueOfstringstring>
      <d2p1:Key>MySecondKey</d2p1:Key>
      <d2p1:Value>MySecondValue</d2p1:Value>
    </d2p1:KeyValueOfstringstring>
  </AllData>
</DynamicProfile>

例如,我需要编写一个查询,将包含节点值的所有行提取到“MySecondKey”。 怎样才能做到这一点?

【问题讨论】:

    标签: xml sql-server-2008 xml-serialization


    【解决方案1】:

    这里是带有 xquery 操作符的 ans-->

    declare @xmldata xml
        set @xmldata = 
        '<DynamicProfile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WinTest">
      <AllData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MyFirstValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  </AllData>
    </DynamicProfile>'
    
    ;WITH XMLNAMESPACES 
    (
        DEFAULT 'http://schemas.datacontract.org/2004/07/WinTest',
        'http://schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1
    )
    SELECT  x.c.value('(d2p1:Key)[1]', 'varchar(100)') as key3, x.c.value('(d2p1:Value)[1]', 'varchar(100)') as value
    FROM @xmldata.nodes('/DynamicProfile/AllData/d2p1:KeyValueOfstringstring') x(c) where x.c.value('(d2p1:Key)[1]', 'varchar(100)') = 'MySecondKey'
    

    【讨论】:

    • 好吧,但在我的例子中,@xmldata 变量是一个表字段。所以,考虑你想执行一个查询来提取与 xml where clausole 匹配的所有行,我该怎么做?
    • 无事可做。对我来说,“翻译” xml 字段并不重要,相反,我只会检索受我的 where 条件影响的所有行。其中条件是指 xml 字段,但最后我想要实现的都是“本机”行,例如: Select * from MyTable WHERE XmlField.Value(key) = 'some value'
    • 好的,解决了..以下正是我想要的: WITH XMLNAMESPACES ( 'schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1 ) select * from MyTable where MyXmlField.exist('//d2p1:Key[.= "MyFirstKey"]') = 1
    【解决方案2】:

    你可以使用下面的TSQL代码-->

    declare @xmldata xml
        set @xmldata = 
        '<DynamicProfile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WinTest">
      <AllData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MyFirstValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MyFirstKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>  </AllData>
    </DynamicProfile>'
    
     DECLARE @hDoc int, @rootxmlns varchar(100)
     SET @rootxmlns = '<AllData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />'
    
     EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata, @rootxmlns  
    
     SELECT *
     FROM OPENXML(@hDoc, '//d2p1:KeyValueOfstringstring',2)
     WITH ([d2p1:Key] varchar(100) , [d2p1:Value] varchar(100)) where [d2p1:Key] = 'MySecondKey'
    
     --clean up 
     EXEC sp_xml_removedocument @hDoc
    

    【讨论】:

    • 为什么需要声明@xmldata 变量?这已经存在于我的表 xml 字段中。另外,有没有使用 XQuery 的解决方案?诸如查询、值、存在方法之类的东西..?
    • 这里推荐使用xquery的类似解决方案 --> stackoverflow.com/questions/1440848/openxml-with-xmlnsdt
    • 请您给我发一个与我的问题相关的明确示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多