我有以下问题:无法更改的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>
我想做的是获取<from>
父元素的<to>
和<propertyChange>
的子元素值,其中属性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经验)。知道我哪里出错了吗?希望这是我的语法。所有帮助都感激不尽……这使我无所适从。
欢呼 博多