TSQL如何在xml列中选择具有技能的员工

时间:2012-01-05 10:20:11

标签: sql-server sql-server-2005 tsql xquery-sql

在下面的表格架构中

CREATE TABLE [dbo].[Employee](
    [EmployeeId] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Location] [nvarchar](50) NOT NULL,
    [Skills] [xml] NOT NULL
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
  • 如果C#列中保存的xml如下所示,我将如何让员工拥有Skills(不区分大小写)的编程技能。

  • 你能否建议其他功能可以帮助我过滤,使用xml数据类型列进行排序

<Skills><Skill>C#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>

1 个答案:

答案 0 :(得分:3)

比较区分大小写,因此您需要与c#和C#进行比较。在SQL Server 2008中,您可以使用upper-case

declare @T table
(
  ID int identity,
  Skills XML
)

insert into @T values
('<Skills><Skill>C#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>')
insert into @T values
('<Skills><Skill>CB.NET</Skill><Skill>ASP.NET</Skill><Skill>c#</Skill></Skills>')
insert into @T values
('<Skills><Skill>F#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>')

select ID
from @T
where Skills.exist('/Skills/Skill[contains(., "C#") or contains(., "c#")]') = 1

结果:

ID
-----------
1
2

更新

这也可以。

select T.ID
from @T as T
  cross apply T.Skills.nodes('/Skills/Skill') as X(N)
where X.N.value('.', 'nvarchar(50)') like '%C#%'