XML 文件翻译 SQL 查询

XML File Translate with SQL query

我有一条 Swift 消息,使用 SQL 查询编码,使用 encoding="utf-16 - 我使用了以下代码:

CAST(REPLACE(CAST(Content AS VARCHAR(MAX)), 'encoding="utf-16"', '')  AS XML) AS Content

我的 XML 结构的内容如下所示:

我想达到的目标

我有一个临时 table,在这个结构中有多个 XML 文件,我正在尝试编写一个 SQL 查询,它将以标准结构显示数据 table

SELECT
    DateTimeCreated,
    t.value('(ApplicationHeaderBlock_Output/MessageType/text())[1]', 'varchar(100)') AS MessageType,
    e.value('(SequenceC/Date_C_98A/Date/text())[1]', 'DATE') AS XDTE,
    e.value('(SequenceC/Date_C_98A//Date/text())[1]', 'DATE') AS RDTE
FROM 
    #MTFILE
CROSS APPLY 
    Content.nodes('//SWIFTHeader') AS a(t)
CROSS APPLY 
    Content.nodes('//SWIFT_CATEGORY5_MT566') AS b(e)

DROP TABLE #MTFILE

问题和我想达到的目标

我不确定如何修改我当前的 SQL 查询以从 XML 文件中获得以下结果,因为当我尝试从 XML 文件中指定路径时,您可以看出是一样的(从截图结构看)

我的目的是实现并查看如下结果:

| XDTE        | RDTE           |
| --------    | -------------- |
| 20210310    | 20211012       |

如果有人可以请指教?

提取 Qualifier 并旋转。我使用条件聚合进行数据透视。您的 DBMS 可能有一个特殊的 PIVOT 工具。

select DateTimeCreated, MessageType,
     max(case when q='XDTE' then d end) as XDTE,
     max(case when q='RDTE' then d end) as RDTE
from (
    -- original query plus `Qualifier`
    -- hopefully it extracts data correctly
    Select DateTimeCreated,
       t.value('(ApplicationHeaderBlock_Output/MessageType/text())[1]', 'varchar(100)') as MessageType,
       e.value('(SequenceC/Date_C_98A/Qualifier/text())[1]', 'DATE') as q,
       e.value('(SequenceC/Date_C_98A/Date/text())[1]', 'DATE') as d
    FROM #MTFILE
    CROSS APPLY Content.nodes('//SWIFTHeader') as a(t)
    CROSS APPLY Content.nodes('//SWIFT_CATEGORY5_MT566') as b(e)
) t
group by DateTimeCreated, MessageType

因为您没有提供最小的可重现示例,我们需要假设您的 SELECT ... 声明是合法的。

这是你的答案。

SQL

SELECT
    DateTimeCreated,
    t.value('(ApplicationHeaderBlock_Output/MessageType/text())[1]', 'varchar(100)') AS MessageType,
    e.value('(SequenceC/Date_C_98A[Qualifier/text()="XDTE"]/Date/text())[1]', 'DATE') AS XDTE,
    e.value('(SequenceC/Date_C_98A[Qualifier/text()="RDTE"]/Date/text())[1]', 'DATE') AS RDTE
FROM 
    #MTFILE
CROSS APPLY 
    Content.nodes('//SWIFTHeader') AS a(t)
CROSS APPLY 
    Content.nodes('//SWIFT_CATEGORY5_MT566') AS b(e);