我如何查询SQL Server XML列中的值

我有以下XML存储在一个SQL Server数据库的XML列(称为Roles )。

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

我想列出所有具有特定angular色的行。 这个angular色通过parameter passing。

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

这些页面将向您展示如何在T-SQL中查询XML:

使用t-sql查询XML字段

在SQL Server中压扁XML数据

编辑

玩了一会儿之后,我结束了这个使用CROSS APPLY的惊人的查询。 这一个将search每一行(angular色)的值你放在你喜欢的expression式…

鉴于这个表结构:

 create table MyTable (Roles XML) insert into MyTable values ('<root> <role>Alpha</role> <role>Gamma</role> <role>Beta</role> </root>') 

我们可以这样查询它:

 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小提琴: http ://sqlfiddle.com/#!3/ae0d5/13

 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 

如果您希望查询where col like '%Beta%'上工作,您可以使用“ 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 

如果您的字段名称是angular色,并且表名是table1,则可以使用以下来search

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

我想出了一个简单的工作,下面很容易记住:-)

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

你可以做到以下几点

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

显然这是一个黑客,我不会推荐任何正式的解决scheme。 但是,我发现这种技术非常有用的SQL Serverpipe理Studio中的SQL Server 2012的XML列做特别查询时。

我使用下面的语句来检索Sql表中XML中的值

 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'