【发布时间】:2019-11-04 22:55:04
【问题描述】:
我有以下问题:我无法更改的 SQL 数据库。带有字段“ID”(自动编号)和“详细信息”(纯文本)的表“LogEntries”。 详细信息字段包含纯文本条目以及 xml 数据。 需要进行双重转换或转换以将“详细信息”转换为我想要的记录的 xml。
XML结构是这样的:
<?xml version="1.0" encoding="utf-16"?>
<changes typeName="Document" name="005019 (0)" id="8567">
<propertyChange name="OwnerPersonName" typeName="System.String" systemName="OwnerPersonID">
<from id="541">Thomas, Marcus</from>
<to id="103">Murphy, Tony</to>
</propertyChange>
<propertyChange name="AuthorPersonName" typeName="System.String" systemName="AuthorPersonID">
<from id="10">Witten, Howard</from>
<to id="750">Atukorala, Anu</to>
</propertyChange>
<propertyChange name="ReviewDateTime" typeName="System.DateTime">
<from>2008-04-28T00:00:00</from>
<to>2010-04-28T00:00:00</to>
</propertyChange>
<collectionChanges typeName="DocumentRelatedStandardsCollection" name="DocumentRelatedStandardsCollection">
<addition typeName="DocumentRelatedStandard" name="Integrated Management System\Implementation\Quality\7.2 Customer related processes" id="239">
<propertyChange name="StandardDescription" typeName="System.String">
<from></from>
<to>Integrated Management System\Implementation\Quality\7.2 Customer related processes</to>
</propertyChange>
<propertyChange name="StandardName" typeName="System.String">
<from></from>
<to>7.2 Customer related processes</to>
</propertyChange>
</addition>
</collectionChanges>
</changes>
我要做的是获取<propertyChange> 父元素的<from> 和<to> 的子元素值,其中属性name = "ReviewDateTime"。
尝试过交叉应用、直接访问(强制转换值)等,并不断出错。最后一次尝试似乎让我接近,但它告诉我子节点不存在。
这就是我的交叉申请:
Select
[QPulseAuditLog].dbo.LogEntries.ID as [LogId]
,t.c.value('/(to)[1]','nvarchar(10)') as [from]
FROM [QPulseAuditLog].[dbo].[LogEntries]
cross apply (select cast(cast([Details] as ntext) as xml) where [QPulseAuditLog].[dbo].[LogEntries].[Details] LIKE '%ReviewDateTime%') as t0(x)
cross apply t0.x.nodes('/changes/propertyChange/@ReviewDateTime') t(c)
这是错误: 消息 2256,第 16 层,状态 1,第 5 行 XQuery [t0.x.value()]: '(' 附近的语法错误,需要“节点测试”。
这就是我获得的直接价值访问:
use [QPulseAuditLog]
SELECT
ID
[Details],
CONVERT(XML,CONVERT(Ntext,[Details])).value('/changes/propertyChange/@ReviewDateTime/from[1]', 'NVARCHAR(MAX)') AS StatusChangeFrom
FROM [QPulseAuditLog].[dbo].[LogEntries]
这是错误: 消息 2261,第 16 层,状态 1,第 6 行 XQuery [value()]: 在类型 'attribute(ReviewDateTime,xdt:untypedAtomic) *' 中没有名为 'from' 的元素。
选项 2 是首选,因为它使我的事情变得更容易(根本没有 XML 经验)。知道我哪里出错了吗?希望这是我的语法。感谢所有帮助......它把我逼到了墙边。
干杯 博多
【问题讨论】:
标签: sql sql-server xml attributes nodes