2017-07-19 109 views
0

我試圖使用where子句中的exists()方法在SQL Server中查詢xml。 查詢的select部分首次出現「SourceIndex」,但where子句根本沒有任何影響。 我想獲得第一次出現的「SourceIndex」,其中「Source」是給定的OID。 我也查看了nodes()方法,但無法使用where子句進行工作。存在名稱空間的SQL Server XML查詢存在於

這裏是我的查詢

Create table #temp (identXml xml) 
Select 
     #temp.identXml.value('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:SourceIndex)[1]','varchar(100)') as Ident 
     ,#temp.identXml.value('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:Source)[1]','varchar(100)') as SourceOID 
     from #temp 
     WHERE #temp.identXml.exist('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:Source)[text() = "00.000.000.00.1.3.43.1.1.8.10"]')=1 

這裏是XML的樣本

Declare @xml xml 

Set @xml= '<PersonIdentity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <CurrentID>87bf-4fcb-8dd9-4e2c43ec73ba</CurrentID> 
    <MasterIndexes> 
    <PersonIndex> 
     <CreationDate>2017-04-27 12:00:00 A.M.</CreationDate> 
     <Source>3.57.1.3.43.1.1.8.10</Source> 
     <SourceIndex>Foo1737</SourceIndex> 
     <SourceType>SYS</SourceType> 

    </PersonIndex> 
    <PersonIndex> 
     <CreationDate>2017-04-25 12:00:00 A.M.</CreationDate> 
     <Source>3.57.1.3.43.1.4.1.8.6</Source> 
     <SourceIndex>Foo002194</SourceIndex> 
     <SourceType>Foo2</SourceType> 



    </PersonIndex> 
    <PersonIndex> 
     <CreationDate>2017-04-25 12:00:00 A.M.</CreationDate> 
     <Source>3.57.1.3.43.102.1.8.1</Source> 
     <SourceIndex>f00189854</SourceIndex> 
     <SourceType>SYS</SourceType> 

    </PersonIndex> 
    <PersonIndex> 
     <CreationDate>2017-07-05 12:00:00 A.M.</CreationDate> 
     <Source>3.57.1.3.43.2.1.8.6</Source> 
     <SourceIndex>foo379</SourceIndex> 
     <SourceType>SYS</SourceType> 

    </PersonIndex> 
    </MasterIndexes> 
</PersonIdentity>' 


DECLARE @exist BIT; 

SET @exist = @xml.exist('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:Source)[text() = "3.57.1.3.43.1.1.8.10"]'); 
SELECT @exist; 

更新

基於跌破我想出了這個SQL這似乎工作進。我試圖在下面的評論中發佈代碼,但無法弄清格式。

Select 
    t.c.query('./*:SourceIndex').value('.', 'varchar(50)') as Ident 
    From @xml.nodes('/*:PersonIdentity/*:MasterIndexes/*:PersonIndex') as t(c) 
    Where t.c.exist('./Source[text() = "3.57.1.3.43.1.1.8.10"]') =1; 
+0

你需要XML查詢,而不是存在。閱讀更多在這裏https://stackoverflow.com/questions/8467006/sql-server-xml-exist – BobNoobGuy

+0

感謝@BobNoobGuy似乎工作。 這裏是SQL語句 'Select tcquery('./*:SourceIndex')。value('。','varchar(50)')作爲Ident 從@ xml.nodes('/ *:PersonIdentity/*:MasterIndexes/*:PersonIndex')as t(c) where tcexist('./ Source [text()=「3.57.1​​.3.43.1.1.8.10」]')= 1; – David

回答

1

而不是#temp.identXml.exist你可能想要使用#temp.identXml.query。你可以閱讀這裏SQL Server XML exist()

更多關於這一點,我相信你也可以使用它像這樣

Select 
#temp.identXml.value('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:SourceIndex)[1]','varchar(100)') as Ident 
,#temp.identXml.value('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:Source)[1]','varchar(100)') as SourceOID 
from #temp 
WHERE #temp.identXml.query('(/*:PersonIdentity/*:MasterIndexes/*:PersonIndex/*:Source)[1]').value('.', 'varchar(100)') = 'Something' 
相關問題