【问题标题】:SQL: Query XML node value, exclude nested nodeSQL:查询XML节点值,排除嵌套节点
【发布时间】:2022-12-06 17:02:44
【问题描述】:

我在将新的 XML 格式导入我们的 MS SQL 数据库时遇到问题。 我的文档看起来与此类似。

<xml>
  <data>
    <email>test@mail.com</email>
    <isActive>
      true
      <previous>false</previous>
    </isActive>
  </data>
</xml>

我的问题是,当我试图查询它时,我无法获得“isActive”列的值“true”,它返回“truefalse”,包括嵌套的“previous”节点。我不知道如何排除它或将它分成 2 个单独的列。

据我了解,这个 XML 应该是完全有效的。

我试过两种方法。 在使用 OPENXML 进行格式更新之前导入文件的当前 SQL 语句,我也试图在此处指定仅采用 isActive 的第一个实例,但第一个实例当然包括“上一个”节点,因为它包含在“isActive”节点。

select
  email,
  isActive
from
  openxml(@xmlDocument, '/data')
  with
  (
    email nvarchar(128) 'email',
    isActive nvarchar(12) 'isActive[1]'
    --isActive nvarchar(12) 'isActive'
  )

使用 xquery

select
  data.col.value('(email)[1]', 'nvarchar(128)'),
  data.col.value('(isActive)[1]', 'nvarchar(12)')
from
  @xmlDocument.nodes('/data') as data(col)

虽然该示例似乎有效,但实际上它在幕后包含了两个值(由于换行) 如果我尝试将其转换为布尔值,则会显示以下内容。

Msg 245, Level 16, State 1, Line 9 Conversion failed when converting the nvarchar value ' true false' to data type bit.

【问题讨论】:

    标签: sql sql-server xml xquery openxml


    【解决方案1】:
    You can do this:
    DECLARE @xmlDocument XML =' <data>
        <email>test@mail.com</email>
        <isActive>
          true
          <previous>false</previous>
        </isActive>
      </data>'
    
    select
      data.col.value('(email)[1]', 'nvarchar(128)') AS [Email],
      data.col.value('(isActive)[1]', 'nvarchar(12)') AS [IsActive],
      data.col.value('(isActive/previous)[1]', 'nvarchar(12)') AS [IsActive_previous]
    from
      @xmlDocument.nodes('/data') as data(col)
    

    【讨论】:

    • 我现在可以看到我自己的 xquery 示例基本上也是您编写的并且它有效,我应该测试我的测试示例。我对我拥有的实际真实数据应用了相同的逻辑,但它仍然给出不正确的结果。匿名化数据后,我将更新原始问题。
    • 好吧,我不知道发生了什么,我创建了一个有限版本的实际数据并且它可以工作,不知何故完整的文档不是,我会认为这是关闭的,因为提供的方法适用于我所有的测试示例,但不适用于实际文件让我觉得该文件还有其他事情要做。谢谢!
    • 啊,我现在想通了,你的例子隐藏了第二个值,如果我将 true/false 转换为布尔值,你也会自己看到它。 Conversion failed when converting the nvarchar value ' true false' to data type bit.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多