2014-10-30 58 views
0

我想搜索xml節點名稱不是值。例如搜索XML其中節點名稱存在sql

我有一個表

CREATE TABLE Batches( 
    BatchID int, 
    RawXml xml 

和XML列數據

<CasinoDisbursementReportXmlFile> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-864</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-865</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-866</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-867</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 

,我想其中的XML列上存在OrganizationNumber節點只得到記錄。

回答

1

我想你正在尋找什麼東西沿線。

select Int, Rawxml from Batches 
where CAST(Rawxml AS VARCHAR(MAX)) like '%OrganizationNumber%'; 

編輯:我糾正了數據類型的XML

+0

正是我試圖爲,但我得到了戰時錯誤消息8116,級別16,狀態1,行1對 參數XML數據類型是像函數的參數1無效。 – user4198563 2014-10-30 14:25:16

+0

我沒有意識到它是一種XML類型。只需添加一個演員 – MADnoobie 2014-10-30 15:03:40

+0

比你!我從來沒有意識到這是簡單的... – user4198563 2014-10-30 15:08:42

0

嘗試是這樣的

select 
    report.x.value('OrganizationReportReferenceIdentifier[1]', 'varchar(max)') as OrganizationReportReferenceIdentifier 
from [Batches] b 
cross apply b.RawXml.nodes('/CasinoDisbursementReportXmlFile/CasinoDisbursementReport/ReportHeader') report(x) 
where report.x.exist('OrganizationNumber') = 1 

我測試下面的腳本(下)這在SQL Server 2012中

注意工作正常我已經刪除了以下測試數據中的OrganizationNumber元素之一。還請注意,您錯過了結束標記</CasinoDisbursementReportXmlFile>,我也將其添加到下面的測試數據中。

CREATE TABLE Batches( 
    BatchID int, 
    RawXml xml) 


INSERT INTO [dbo].[Batches] 
      ([BatchID] 
      ,[RawXml]) 
    VALUES 
      (1 
      ,'<CasinoDisbursementReportXmlFile> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-864</OrganizationReportReferenceIdentifier> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-865</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-866</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport> 
    <CasinoDisbursementReport> 
     <ReportHeader> 
      <OrganizationReportReferenceIdentifier>C234-867</OrganizationReportReferenceIdentifier> 
      <OrganizationNumber>0002141</OrganizationNumber> 
     </ReportHeader> 
    </CasinoDisbursementReport></CasinoDisbursementReportXmlFile>') 


select 
    report.x.value('OrganizationReportReferenceIdentifier[1]', 'varchar(max)') as OrganizationReportReferenceIdentifier 
from [Batches] b 
cross apply b.RawXml.nodes('/CasinoDisbursementReportXmlFile/CasinoDisbursementReport/ReportHeader') report(x) 
where report.x.exist('OrganizationNumber') = 1 
+0

感謝您的回覆。它正在工作,但我想在'OrganizationNumber'存在時選擇RawXml。 – user4198563 2014-10-30 14:52:18

+0

太棒了!謝謝。它爲我工作.... – user4198563 2014-10-30 15:04:59