【问题标题】:How do I query an XML field in SQL如何在 SQL 中查询 XML 字段
【发布时间】:2009-09-03 21:04:58
【问题描述】:

这是我在 SQL 中的 XML 字段的内容:

- <TestingConfig xmlns="http://tempuri.org/TestingConfig.xsd">
 `- <Config>`
      `<ConfigId>75</ConfigId>` 
      `<PlaceId>2</PlaceId>` 
      `<Identifier>05</Identifier>` 
      `<Name>TEST1</Name>` 
      `</Config>`
  `- <Config>`
      `<ConfigId>76</ConfigId>` 
      `<PlaceId>2</PlaceId>` 
      `<Identifier>06</Identifier>` 
      `<Name>TEST2</Name>` 
      `</Config>`
 `</TestingConfig>`

我需要查询它并以这样的行返回结果:

    Config ID       PlaceID        Identifier        Name
    75              2              05                TEST1
    76              2              06                TEST2

我需要它不在结果中包含命名空间。我是 XML 查询的新手。感谢您的帮助。

【问题讨论】:

  • 你用的是什么数据库引擎?
  • XML文件是如何存储的?是作为文件读取,存储在 XML 数据类型列中,还是存储为 text/varchar?

标签: sql-server xml


【解决方案1】:

如果您使用的是 SQL Server 2005 或 2008,这样的东西应该适合您...

DECLARE @xml XML

SELECT @xml = '<TestingConfig>
 <Config>
      <ConfigId>75</ConfigId>
      <PlaceId>2</PlaceId>
      <Identifier>05</Identifier>
      <Name>TEST1</Name>
      </Config>
  <Config>
      <ConfigId>76</ConfigId>
      <PlaceId>2</PlaceId>
      <Identifier>06</Identifier>
      <Name>TEST2</Name>
      </Config>
 </TestingConfig>'

 SELECT node.ref.value( 'ConfigId[1]', 'int' ) AS [ConfigId],
        node.ref.value( 'PlaceId[1]', 'int' ) AS [PlaceId],
        node.ref.value( 'Identifier[1]', 'varchar(32)' ) AS [Ident],
        node.ref.value( 'Name[1]', 'varchar(32)' ) AS [Name]
        FROM @xml.nodes( '/TestingConfig/Config' ) AS node(ref)

【讨论】:

  • 对此不确定。目前我的 XML 存储在 SQL 表中。会不会更像 DECLARE @xml XML SET @xml = (select ConfigField from TestingConfig) 但是,当我这样做时,我没有得到任何结果。我很幸运,但它不是我想要的格式 - 你上面显示的内容看起来更符合它。除非我声明命名空间,否则我似乎无法提取数据。有什么建议么?谢谢!!!!
  • 对我有用的声明,但不是我需要的格式。 SELECT TestingConfig.ConfigField.query('declare namespace x="tempuri.org/TestingConfig.xsd"; (/x:TestingConfig/x:Config/x:ConfigId)') as ConfigId, TestingConfig.ConfigField.query('declare namespace x="@ 987654322@"; (/x:TestingConfig/x:Config/x:Name)') as Name FROM TestingConfig GO
【解决方案2】:

这对我有用。感谢大家的回复。

使用 XMLNAMESPACES ('http://tempuri.org/TestingConfig.xsd' AS CC)

选择

CC.Config.value('CC:ConfigId[1]', 'int') AS [ConfigId],

CC.Config.value('CC:PlaceId[1]', 'int') AS [PlaceId],

CC.Config.value('CC:Identifier[1]', 'char(2)') AS [标识符],

CC.Config.value('CC:Name[1]', 'varchar(8)') AS [名称]

来自测试配置

CROSS APPLY TestingConfig.ConfigField.nodes('//CC:Config') AS CC(Config)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多