Yanıtlar:
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
[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
.
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
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
like
mı? forexample /root/role like ....
.value('(/root/role)[1]', 'varchar(max)') like '%yourtext%'
yerine exists
Leniel'in açıkladığı gibi kullanın
@Role
.
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%'
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.
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
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'
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
[1]
, cevabınızda ne var ?