Mam następujący XML przechowywany w kolumnie XML (nazywanej Roles
) w bazie danych SQL Server.
<root>
<role>Alpha</role>
<role>Beta</role>
<role>Gamma</role>
</root>
Chciałbym wymienić wszystkie wiersze, które pełnią w nich określoną rolę. Ta rola jest przekazywana przez parametr.
sql
sql-server
xml
xquery
Bistro
źródło
źródło
[1]
w twojej odpowiedzi?[1]
było naprawdę dobre pytanie. Oznacza to, że wybierasz pierwszą wartość roli z XML, a to oznacza, że będzie to działać tylko w przypadku znalezieniaAlpha
w przykładowym pliku XML. Nie znajdzie wiersza, jeśli szukaszBeta
.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
Jeśli chcesz, aby zapytanie działało tak
where col like '%Beta%'
, jak możesz użyćcontains
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
źródło
jeśli nazwa twojego pola to Role, a nazwa tabeli to tabela1, możesz użyć następujących do wyszukiwania
DECLARE @Role varchar(50); SELECT * FROM table1 WHERE Roles.exist ('/root/role = sql:variable("@Role")') = 1
źródło
like
?forexample /root/role like ....
.value('(/root/role)[1]', 'varchar(max)') like '%yourtext%'
zamiast tego,exists
jak wyjaśnił Leniel@Role
.Wymyśliłem prostą pracę poniżej, która również jest łatwa do zapamiętania :-)
select * from (select cast (xmlCol as varchar(max)) texty from myTable (NOLOCK) ) a where texty like '%MySearchText%'
źródło
Możesz wykonać następujące czynności
declare @role varchar(100) = 'Alpha' select * from xmltable where convert(varchar(max),xmlfield) like '%<role>'+@role+'</role>%'
Oczywiście to trochę hack i nie polecałbym tego do żadnych formalnych rozwiązań. Jednak uważam, że ta technika jest bardzo przydatna podczas wykonywania zapytań adhoc na kolumnach XML w programie SQL Server Management Studio dla programu SQL Server 2012.
źródło
Przydatna wskazówka. Zapytanie o wartość w kolumnie XML programu SQL Server (XML z przestrzenią nazw)
na przykład
Table [dbo].[Log_XML] contains columns Parametrs (xml),TimeEdit (datetime)
np. XML w parametrach:
<ns0:Record xmlns:ns0="http://Integration"> <MATERIAL>10</MATERIAL> <BATCH>A1</BATCH> </ns0:Record>
np. zapytanie:
select Parametrs,TimeEdit from [dbo].[Log_XML] where Parametrs.value('(//*:Record/BATCH)[1]', 'varchar(max)') like '%A1%' ORDER BY TimeEdit DESC
źródło
Użyłem poniższej instrukcji, aby pobrać wartości w XML w tabeli Sql
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'
źródło
Możesz zapytać o cały tag lub tylko o określoną wartość. Tutaj używam symbolu wieloznacznego dla przestrzeni nazw xml.
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
źródło