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;
你需要XML查詢,而不是存在。閱讀更多在這裏https://stackoverflow.com/questions/8467006/sql-server-xml-exist – BobNoobGuy
感謝@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