SQL Server通过查询父节点属性名称

我有以下问题:无法更改的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经验)。知道我哪里出错了吗?希望这是我的语法。所有帮助都感激不尽……这使我无所适从。

欢呼 博多

XHLIZIMING 回答:SQL Server通过查询父节点属性名称

这里是完整的DDL和有效的示例。最好将XML视为XML数据类型,并使用 XQuery 对其进行查询。

  

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,Details NVARCHAR(MAX));
INSERT INTO @tbl (Details)
VALUES
(N'<?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>'),('Plain text');
-- DDL and sample data population,end

;WITH rs AS
(
    SELECT *,TRY_CAST(CAST(Details AS NTEXT) AS XML) AS xml_data FROM @tbl
)
SELECT ID,col.value('(from/text())[1]','DATETIME') AS [From],col.value('(to/text())[1]','DATETIME') AS [To]
FROM rs
      CROSS APPLY rs.[xml_Data].nodes('/changes/propertyChange[@name="ReviewDateTime"]') AS tab(col);
  

输出

+----+-------------------------+-------------------------+
| ID |          From           |           To            |
+----+-------------------------+-------------------------+
|  1 | 2008-04-28 00:00:00.000 | 2010-04-28 00:00:00.000 |
+----+-------------------------+-------------------------+
本文链接:https://www.f2er.com/3163265.html

大家都在问