使用SQL过滤XML

时间:2014-06-13 11:21:06

标签: sql xml filter bpm

我正在研究BPM并提取了一个大的xml文件,我现在想用SQL过滤。我想过滤它,以便我只提取具有101的“角色类型”的contractrole子对象。我的xml是这样的形式:

<contract>
  <ContractRole>
    <ContractId>xxxgg</ContractId>
    <RoleType>104</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
  </ContractRole>
  <ContractRole>
    <ContractId>xxxaa</ContractId>
    <RoleType>100</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
  </ContractRole>
  <ContractRole>
    <ContractId>xxxdd</ContractId>
    <RoleType>101</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate> 
  </ContractRole>
<contract>

如何过滤掉101以外的其他角色类型的条目?我几乎没有使用SQL的经验,但我希望使用SELECT语句WHERE roletype是101.我可以在直接调用数据库时轻松完成此操作,但在这里我需要从XML中提取相同的信息。

在线随机示例提出了类似的建议:

SELECT child.value('(LastUpdate/text())[1]', 'TIMESTAMP') AS [LastUpdateDate]
       , child.value('(ContractId/text())[1]', 'BIGINT') AS [Id]
   FROM [Contract] AS T
CROSS APPLY [ImportData].nodes('/Contract/ContractRole[RoleType/text() == "101"]') AS ImportData(child)

有人可以澄清我如何进行此过滤器。在选择任何内容之前,我是否需要声明我的xml名称?或者它是如何工作的?

1 个答案:

答案 0 :(得分:0)

假设这是SqlServer,并且你在松散变量中有Xml(否则你需要CROSS APPLY到表,但表格是相同的(有{{3}用于直接从磁盘处理Xml列或Xml文件。一些注意事项:

  • 请注意,xml区分大小写,即contractContract不一样
  • Xpath和xsl使用单个=进行相等
  • BIGINT其中一个日期类型(如DATETIME)似乎更适合xml的类型映射。
  • contract关闭标记拼写错误。

SELECT node.value('(LastUpdateDate/text())[1]', 'DATETIME') AS [LastUpdateDate]
       , node.value('(ContractId/text())[1]', 'VARCHAR(20)') AS [Id]
   FROM @x.nodes('/contract/ContractRole[RoleType/text() = "101"]') AS nodes(node);

我假设了以下内容:

DECLARE @x XML = 
'<contract>
  <ContractRole>
    <ContractId>xxxgg</ContractId>
    <RoleType>104</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
  </ContractRole>
  <ContractRole>
    <ContractId>xxxaa</ContractId>
    <RoleType>100</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
  </ContractRole>
  <ContractRole>
    <ContractId>xxxdd</ContractId>
    <RoleType>101</RoleType>
    <LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate> 
  </ContractRole>
</contract>';

返回

LastUpdateDate          Id
----------------------- --------------------
2014-04-01 12:34:12.840 xxxdd