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);
我有一条 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);