SQL Server XML sütunundaki bir değeri nasıl sorgulayabilirim


127

Aşağıdaki XML Roles, bir SQL Server veritabanında bir XML sütununda (çağrılır ) depolandı .

<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>

İçlerinde belirli bir rolü olan tüm satırları listelemek istiyorum. Bu rol parametre ile geçti.

Yanıtlar:


198
select
  Roles
from
  MyTable
where
  Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'

Bu sayfalar size T-SQL'de XML sorgulama hakkında daha fazla bilgi verecektir:

T-sql kullanarak XML alanlarını sorgulama

XML Verilerini SQL Server'da Düzleştirme

DÜZENLE

Onunla biraz daha oynadıktan sonra, CROSS APPLY kullanan bu harika sorguyla karşılaştım. . Bu, benzer ifadenize koyduğunuz değer için her satırı (rolü) arayacaktır ...

Bu tablo yapısı göz önüne alındığında:

create table MyTable (Roles XML)

insert into MyTable values
('<root>
   <role>Alpha</role>
   <role>Gamma</role>
   <role>Beta</role>
</root>')

Bunu şu şekilde sorgulayabiliriz:

select * from 

(select 
       pref.value('(text())[1]', 'varchar(32)') as RoleName
from 
       MyTable CROSS APPLY

       Roles.nodes('/root/role') AS Roles(pref)
)  as Result

where RoleName like '%ga%'

SQL Fiddle'ı buradan kontrol edebilirsiniz : http://sqlfiddle.com/#!18/dc4d2/1/0


5
Tüm sorumu cevaplıyor [1], cevabınızda ne var ?
Bistro

1
Harika cevap, buna oy veriyorum, ancak dizi varchar olmalı sanırım
AaA

7
@Bistro Sormak [1]gerçekten güzel bir soruydu. Bu, XML'den ilk rol değerini seçtiğiniz anlamına gelir ve bu, bunun yalnızca Alphaörnek xml'nizde bulmak için çalışacağı anlamına gelir . Eğer ararsanız, satırı bulamayacaktır Beta.
Mikael Eriksson

1
Benim durumumda, belirli öznitelik değerine sahip düğümleri sorgulamam gerekiyordu. Bu cevap benim çözümüme giden yol oldu. Öznitelik değerinin çevresine çift tırnak işareti koymak zorunda kaldım.
John N

XML'in bir ad alanı varsa, onu nasıl sorgulayabiliriz?
FMFF

36
declare @T table(Roles xml)

insert into @T values
('<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>')

declare @Role varchar(10)

set @Role = 'Beta'

select Roles
from @T
where Roles.exist('/root/role/text()[. = sql:variable("@Role")]') = 1

Sorgunun kullanabileceğiniz gibi çalışmasını where col like '%Beta%'istiyorsanızcontains

declare @T table(Roles xml)

insert into @T values
('<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>')

declare @Role varchar(10)

set @Role = 'et'

select Roles
from @T
where Roles.exist('/root/role/text()[contains(., sql:variable("@Role"))]') = 1

13

alan adınız Roller ve tablo adı tablo1 ise, arama yapmak için aşağıdakileri kullanabilirsiniz

DECLARE @Role varchar(50);
SELECT * FROM table1
WHERE Roles.exist ('/root/role = sql:variable("@Role")') = 1

bu iyi, kullanarak arama yapmanın bir yolu var likemı? forexample /root/role like ....
Bistro

2
.value('(/root/role)[1]', 'varchar(max)') like '%yourtext%'yerine existsLeniel'in açıkladığı gibi kullanın
AaA

4
Bunu denedin mi Ne koyarsanız koyun her şeyi bulur @Role.
Mikael Eriksson

6

Aşağıda hatırlaması da kolay olan basit bir çalışma buldum :-)

select * from  
(select cast (xmlCol as varchar(max)) texty
 from myTable (NOLOCK) 
) a 
where texty like '%MySearchText%'

1
Dize manipülasyonu yoluyla arama yapmamamız gerekiyor, çünkü bu çok yavaş aramalara yol açacak
Malcolm Salvador

5

Aşağıdakileri yapabilirsin

declare @role varchar(100) = 'Alpha'
select * from xmltable where convert(varchar(max),xmlfield) like '%<role>'+@role+'</role>%'

Açıkçası bu biraz hack ve herhangi bir resmi çözüm için tavsiye etmem. Bununla birlikte, SQL Server 2012 için SQL Server Management Studio'da XML sütunlarında anlık sorgular yaparken bu tekniği çok yararlı buluyorum.


2

Yararlı ipucu. SQL Server XML sütununda bir değeri sorgulama (ad alanlı XML)

Örneğin

Table [dbo].[Log_XML] contains columns Parametrs (xml),TimeEdit (datetime)

örneğin Parametrelerde XML:

<ns0:Record xmlns:ns0="http://Integration"> 
<MATERIAL>10</MATERIAL> 
<BATCH>A1</BATCH> 
</ns0:Record>

örneğin Sorgu:

select
 Parametrs,TimeEdit
from
 [dbo].[Log_XML]
where
 Parametrs.value('(//*:Record/BATCH)[1]', 'varchar(max)') like '%A1%'
 ORDER BY TimeEdit DESC

1

Sql tablosundaki XML'deki değerleri almak için aşağıdaki ifadeyi kullandım

with xmlnamespaces(default 'http://test.com/2008/06/23/HL.OnlineContract.ValueObjects')
select * from (
select
            OnlineContractID,
            DistributorID,
            SponsorID,
    [RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Name[1]', 'nvarchar(30)') as [Name]
   ,[RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Value[1]', 'nvarchar(30)') as [Value]
     ,[RequestXML].value(N'/OnlineContractDS[1]/Locale[1]', 'nvarchar(30)') as [Locale]
from [OnlineContract]) as olc
where olc.Name like '%EMAIL%' and olc.Value like '%EMAIL%' and olc.Locale='UK EN'

XML Ad alanı tanımını içermiyorsa ne olur?
Muflix

0

Tüm etiketi veya yalnızca belirli değeri sorgulayabilirsiniz. Burada xml ad alanları için bir joker karakter kullanıyorum.

declare @myDoc xml
set @myDoc = 
'<Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://stackoverflow.com">
    <Child>my value</Child>
 </Root>'

select @myDoc.query('/*:Root/*:Child') -- whole tag
select @myDoc.value('(/*:Root/*:Child)[1]', 'varchar(255)') -- only value
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.