我如何查询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'