TSQL Как выбрать сотрудника с навыками в столбце xml - PullRequest
3 голосов
/ 05 января 2012

В схеме таблицы, как показано ниже

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 Ответ

3 голосов
/ 05 января 2012

Сравнение чувствительно к регистру, поэтому вам нужно сравнить как с c #, так и с C #.В SQL Server 2008 вы можете использовать заглавные буквы .

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#%'
...