【问题标题】:Can't seem to query xml data type correctly似乎无法正确查询 xml 数据类型
【发布时间】:2018-02-08 20:54:17
【问题描述】:

我想成功查询(在 SSMS 中)我的数据库中包含不同类型的 XML 中所谓的 AddressElements 的列。包含所有 AddressElements 的表如下所示:

create table AddressElements(Address.Id int, AddressType.Id int, AddressElement xml)

AddressElement xml 列中的 XML 示例的结构如下:

<AddressElements xmlns="http://www.myorganisation.nl/schemas/2007/BusinessPropertySchema/AddressElements/Postadres">
    <Postadres_default Straatnaam="Main Street" Huisnummer="1" Postcode="9999 XX" Plaats="ROTTERDAM" />
</AddressElements>

我首先尝试使用 WHERE 语句进行以下查询,以过滤掉我感兴趣的特定 AddressElement。

SELECT m.c.value('@Straatnaam', 'nvarchar(50)') AS Straatnaam
, m.c.value('@Huisnummer', 'int') AS Huisnummer
, m.c.value('@Postcode', 'nvarchar(50)') AS Postcode
, m.c.value('@Plaats', 'nvarchar(50)') AS Plaats

FROM Address as s
    outer apply s.AddressElements.nodes('AddressElements/Postadres_default') AS m(c)

WHERE s.AddressTypeId = '00000000-0000-0000-0000-000000000002'

不幸的是,结果是:

Straatnaam  Huisnummer  Postcode    Plaats
NULL        NULL        NULL        NULL
NULL        NULL        NULL        NULL
NULL        NULL        NULL        NULL
NULL        NULL        NULL        NULL

我搜索了与我类似的问题/帖子,但到目前为止,我无法让这些解决方案适用于我的情况。如果你们中的任何一个可以帮助我,那就太好了!非常感谢您!

亲切的问候,英格玛

【问题讨论】:

  • 这是一个问题,因为您在 AddressElements 节点中有一个命名空间。解决此问题的一种快速方法是将节点部分更改为 ('/*:AddressElements/*:Postadres_default')
  • @ZLK 感谢您的回复。不幸的是,我仍然得到了相同的结果。您还有其他建议吗?
  • 我刚刚使用您提供的示例进行了测试,这似乎有效,但如果它仍然不适合您,我建议在查询 XML 时查看使用名称空间解决的不同问题.例如:stackoverflow.com/questions/16461834/…
  • 我认为 ZLK 建议的 @I.deSwart XPath 应该有效。考虑创建一个fiddle 来演示问题(参见:Tips for asking a good Structured Query Language (SQL) question
  • 我终于成功了!不知何故,当我昨晚尝试时,我混淆了两种地址类型的属性,这就是它不起作用的原因。可能太累了,无法思考!非常感谢@ZLK!

标签: sql sql-server xml tsql


【解决方案1】:

ZLK 在 cmets 中提供的解决方案应该可以工作。

例如,试试这个:

CREATE TABLE Address (AddressId int, AddressTypeId uniqueidentifier, AddressElements xml)

INSERT INTO dbo.Address (AddressId, AddressTypeId, AddressElements)
VALUES (1,'00000000-0000-0000-0000-000000000002',
'<AddressElements xmlns="http://www.myorganisation.nl/schemas/2007/BusinessPropertySchema/AddressElements/Postadres">
    <Postadres_default Straatnaam="Main Street" Huisnummer="1" Postcode="9999 XX" Plaats="ROTTERDAM" />
</AddressElements>')

SELECT m.c.value('@Straatnaam', 'nvarchar(50)') AS Straatnaam
, m.c.value('@Huisnummer', 'int') AS Huisnummer
, m.c.value('@Postcode', 'nvarchar(50)') AS Postcode
, m.c.value('@Plaats', 'nvarchar(50)') AS Plaats
FROM Address as s
    outer apply s.AddressElements.nodes('*:AddressElements/*:Postadres_default') AS m(c)
WHERE s.AddressTypeId = '00000000-0000-0000-0000-000000000002'

;WITH XMLNAMESPACES('http://www.myorganisation.nl/schemas/2007/BusinessPropertySchema/AddressElements/Postadres' as s)
SELECT m.c.value('@Straatnaam', 'nvarchar(50)') AS Straatnaam
, m.c.value('@Huisnummer', 'int') AS Huisnummer
, m.c.value('@Postcode', 'nvarchar(50)') AS Postcode
, m.c.value('@Plaats', 'nvarchar(50)') AS Plaats
FROM Address as s
    outer apply s.AddressElements.nodes('s:AddressElements/s:Postadres_default') AS m(c)
WHERE s.AddressTypeId = '00000000-0000-0000-0000-000000000002'

【讨论】:

  • 非常感谢您的帮助。我终于成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多