【发布时间】: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