【问题标题】:XML File Translate with SQL query使用 SQL 查询进行 XML 文件翻译
【发布时间】:2021-06-16 19:08:15
【问题描述】:

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

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

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

我想要达到的目标

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

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 并通过Qualifier 值旋转Date
  • @Dijkgraaf - 嗯,你是什么意思?
  • @Serg 嗯,你能写一个简单的例子吗?不确定
  • @Dijkgraaf - Microsoft SQL

标签: sql sql-server xml tsql xquery


【解决方案1】:

由于您没有提供可重现的最小示例,我们需要假设您的 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);

【讨论】:

【解决方案2】:

提取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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多