【问题标题】:sql query search for a value in an xml columnsql查询搜索xml列中的值
【发布时间】:2018-07-06 23:07:11
【问题描述】:
<MultiItems>
    <Items>
        <Profile>221</Profile>
        <Creator Company Name>pepsi</Creator Company Name>
        <Creator Contact Name>pepsico</Creator Contact Name>
        <SUPC>11</SUPC>
        <Keywords>beverages</Keywords>
    </Items>
</MultiItems>

这就是 xml 在文件中的样子 我的 sql server 数据库中有一个 xml 列。它包含有关产品的元数据信息。不同的标签是产品的不同元数据。我应该如何从这个 xml 中检索所有值,包括创建者联系人姓名、supc,以及如何返回其中没有值的标签的名称。

【问题讨论】:

  • @shnugo 谢谢。正确的 xml 是 2111ccf8d18-3dd7-4a7e-a​​6ce-630bfd8f33585ae9a004-c0de-4692-a9bd -e8f73926f4f3创建者公司名称:SGS 测试
  • 我正在寻找其中没有值的标签。在此示例中,名称(是字段名称,但其标签中没有值)有一个字段,但其中没有值。 23453c72c46-575b-426a-903d-2969bda4efcd多语言
  • 1) 将 cmets 放入相关答案或 2) 将附加信息放入您的问题(使用编辑选项)。 3) 您的 cmets 中的 XML 包含一些我必须删除的不可见字符,然后才能对此进行测试... 4) &lt;Name&gt; 不是没有值?看看我的例子。但是例如第二个示例中的&lt;Value&gt; 为空。请参阅我的新答案。
  • @shnugo 谢谢我会试试这个。 是字段名称, 是与字段名称关联的值。将其视为表格的 2 列。因此,如果我有 2 列称为字段名称和值。我将在第一列中使用多语言,但在第二列中使用空数据。我正在寻找这样的标签

标签: xml tsql xpath sql-server-2012 xquery


【解决方案1】:

提前做一些事情:

  • 您的问题中发布的 XML 无效。我已经告诉过你,你在问题下方的 cmets 中发布了一些示例。
  • 我现在正在使用这些示例,尽管在您发布的 XML 中存在一些奇怪的字符,我不得不将其删除。当您使用光标遍历文本并到达光标不会移动的位置时,您会找到它们...
  • 您的最后一个示例没有正确的结束标记。

无论如何,我真的不知道,你想要什么。根据您的问题,您正在尝试读取值,但在您声明的 cmets 中,您正在寻找没有值的节点。但是 - 我会同时显示:

DECLARE @tbl TABLE(ID INT IDENTITY, YourXmlColumn XML);
INSERT INTO @tbl VALUES
(N'<MultiItems>
  <Item>
    <Profile>211</Profile>
    <Metadatas>
      <Metadata>
        <Control>1ccf8d18-3‌​dd7-4a7e-a6ce-630bfd‌​8f3358</Control>
        <ControlTypeID>5ae9a004-‌​c0de-4692-a9bd-e8f73‌​926f4f3</ControlTypeID>
        <Name>Creator Company Name:</Name>
        <Value>SGS Test</Value>
        <ControlDatas />
      </Metadata>
    </Metadatas>
  </Item>
</MultiItems>')
,(N'<MultiItems>
  <Item>
    <Profile>234</Profile>
    <Metadatas>
      <Metadata>
        <Control>53c72c46-5‌​75b-426a-903d-2969bd‌​a4efcd</Control>
        <Name>Multi Lingual</Name>
        <Value />
        <ControlDatas />
      </Metadata>
    </Metadatas>
  </Item>
</MultiItems>');

--值查询

SELECT t.id
      ,t.YourXmlColumn.value(N'(/MultiItems/Item/Profile/text())[1]',N'int') AS [Profile]
      ,t.YourXmlColumn.value(N'(/MultiItems/Item/Metadatas/Metadata/Control/text())[1]',N'nvarchar(max)') AS [Control]
      ,t.YourXmlColumn.value(N'(/MultiItems/Item/Metadatas/Metadata/Name/text())[1]',N'nvarchar(max)') AS [Name]
      ,t.YourXmlColumn.value(N'(/MultiItems/Item/Metadatas/Metadata/Value/text())[1]',N'nvarchar(max)') AS [Value]
FROM @tbl AS t;

--如果你想查看&lt;Metadata&gt; 中没有文本的所有节点,试试这个

SELECT t.id
      ,nd.value(N'local-name(.)',N'nvarchar(max)') AS EmptyNodeName
FROM @tbl AS t
CROSS APPLY t.YourXmlColumn.nodes(N'//Metadata/*[empty(text())]') AS A(nd)

更新

我的错误答案是你的错误措辞的结果

想返回没有值的标签的名字

没有价值的标签是没有价值的那个,不是另一个……

试试这个

SELECT t.id
      ,nd.value(N'text()[1]',N'nvarchar(max)') AS EmptyNodeName
FROM @tbl AS t
CROSS APPLY t.YourXmlColumn.nodes(N'//Metadata[empty(Value/text())]/Name') AS A(nd);

如果Value/text() 为空,这将在&lt;Metadata&gt; 下方找到&lt;Name&gt; 节点。

【讨论】:

  • 感谢您的询问。在您给出的第二个答案中,它检索没有值的节点的值,我想返回没有值的标签的名称。在上面的示例中,Multi Lingual 在其 标记中没有对应的值,因此我希望将 标记或 (MultiLingual) 作为答案返回
  • 非常感谢!这个信息救了我!很抱歉我犯的错误。这是我第一次提出问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2018-12-19
  • 2017-07-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多