簡體   English   中英

使用SQL過濾XML

[英]Filtering XML with SQL

我正在使用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角色類型是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命名一個名稱,或者它如何工作?

假設這是SqlServer ,並且Xml中有一個松散變量(否則您需要對表進行CROSS APPLY,但是形式是相同的( 請看這里以直接從磁盤使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM