【问题标题】:Is it possible to Parse this XML file using SQL Server or SSIS?是否可以使用 SQL Server 或 SSIS 解析此 XML 文件?
【发布时间】:2013-06-16 19:40:52
【问题描述】:

我从名为 MDM 的财务数据提供商处收到了一个 XML 文件。它显示了我下载了哪些股息。它包括股息率、日期和要求的证券等信息。

我尝试使用 XML 源和 Merge Join 使用 SSIS 来解析它。我还尝试了使用 Open XML 的 SQL Server 2012,但无法做到。我从 Youtube、谷歌和搜索这个板中收集了这些技术。我的目标是使其采用易于阅读的表格格式,以便我可以查看哪些证券收到了股息信息。

当我尝试使用 SSIS 解析它时,给出了以下输出名称

FIELD
SECURITY
APP_PARAM
MDM_MESSAGE

XML 文件太大,无法在此处完整发布,但我提供了一个希望有效的 Dropbox 链接。希望有人可以提供帮助。我不确定这个文件是否可以解析,尽管 XML 可以解析。

https://dl.dropboxusercontent.com/u/29851290/parse_file.xml

理想情况下,输出将是这样的。

SYM_TYPE_ID   SEC_SYMBOL  SEC_TYPE_ID FOR DATE    EX_DT    PAY_DT     WASH_AMOUNT      RATE TICKER           
aapl          csus        (Not sure)  5/15/2013   6/1/2013 (Not Sure)    0.25

【问题讨论】:

  • 您需要从这个 XML 中提取哪些信息(哪些节点、哪些属性)?
  • 我想获取 SYM_TYPE_ID、SEC_SYMBOL、SEC_TYPE_ID、FOR DATE、EX_DT、PAY_DT、WASH_AMOUNT、RATE

标签: sql-server xml xml-parsing ssis


【解决方案1】:

试试这个 -

DECLARE @XML XML
SELECT @XML = CONVERT (XML, [BulkColumn])
FROM OPENROWSET (BULK N'C:\parse_file.xml', SINGLE_BLOB) [XmlData]

SELECT PROV_ID = t.c.value('../@PROV_ID', 'VARCHAR(25)') 
     , SYM_TYPE_ID = t.c.value('../@SYM_TYPE_ID', 'VARCHAR(25)')
     , SEC_SYMBOL = t.c.value('../@SEC_SYMBOL', 'VARCHAR(25)')
     , SEC_TYPE_ID = t.c.value('../@SEC_TYPE_ID', 'VARCHAR(25)')
     , LOCAL_NAME = t.c.value('@LOCAL_NAME', 'VARCHAR(25)')
     , FOR_DATE = t.c.value('@FOR_DATE', 'DATETIME')
     , FIELD = t.c.value('.', 'VARCHAR(25)')
FROM @XML.nodes('root/MDM_MESSAGE[2]/SECURITY/FIELD') t(c)
WHERE t.c.value('@SEC_SYMBOL', 'VARCHAR(25)') = '57636Q104'

UNION ALL

SELECT PROV_ID = t.c.value('@PROV_ID', 'VARCHAR(25)') 
     , SYM_TYPE_ID = t.c.value('@SYM_TYPE_ID', 'VARCHAR(25)')
     , SEC_SYMBOL = t.c.value('@SEC_SYMBOL', 'VARCHAR(25)')
     , SEC_TYPE_ID = t.c.value('@SEC_TYPE_ID', 'VARCHAR(25)')
     , LOCAL_NAME = NULL
     , FOR_DATE = NULL
     , FIELD = NULL
FROM @XML.nodes('root/MDM_MESSAGE[2]/SECURITY') t(c)
WHERE t.c.exist('FIELD') = 0
     AND t.c.value('@SEC_SYMBOL', 'VARCHAR(25)') = '57636Q104'

【讨论】:

  • 这很接近,但最终会运行 2 个单独的查询,以及两个单独的网格结果集。另外,我如何将其指向已保存的 xml 文件,而不是在查询中包含文件的全部内容?我尝试更改此行 SELECT @XML = 'c:\xmlfiles\parse_file.xml' 但这没有用。
  • 如果我删除第一个选择语句,它似乎工作正常。我只是通过联合将后面的两个结合起来。如果可能的话,我仍然想将它指向一个实际的 xml 文件。谢谢。
  • Devart,感谢这项工作,非常有帮助。最后一个问题。如何添加 where 子句以对给定字段更具选择性?例如,我尝试了 WHERE t.c.exist('FIELD') = 0 和 SEC_Symbol = '57636Q104' 但这不起作用?
  • 很好用。最后一个问题。您是如何构建此查询的?是否有开发工具可以帮助您构建它,或者您是否仅通过查看 xml 文件来编写整个东西?我已将问题标记为已回答。
  • 我使用的dbForge Studio for MS-SQL 最适合我的需求,可以解决我所有的专业任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多