У вас будут просто жуткие проблемы. Работать с типом XML больше рекомендуется при небольшом наборе.
Если у вас таблица Video будет большая, то без пляски начнутся жуткие проседания сервера.
Во вторых, у вас полное сканирование таблицы и вам придётся играться с XML индексами.
Судя по всему была создана стратегическая ошибка проектирования, скорее всего от жадной лени. Желательная структура системы:
CREATE TABLE [dbo].[KeyWord](
[KeyWord] Int IDENTITY
CONSTRAINT [PK_Keywords] PRIMARY KEY
,[Name] VarChar(250)] NOT NULL
)
GO
CREATE TABLE [dbo].[Video](
[Video] Int IDENTITY
CONSTRAINT [PK_Video] PRIMARY KEY
,... Data ...
)
GO
CREATE TABLE [dbo].[VideoKeyWord](
[Video] Int
CONSTRAINT [FK_VideoKeyWord_Video] REFERENCE [dbo].[Video] ([Video])
,[KeyWord] Int
CONSTRAINT [FK_VideoKeyWord_KeyWord] REFERENCE [dbo].[KeyWord] ([KeyWord])
,CONSTRAINT [PK_VideoKeyWord] PRIMARY KEY (
[Video]
,[KeyWord]
)
,CONSTRAINT [UK_VideoKeyWord] UNIQUE (
[KeyWord]
,[Video]
)
)
GO
Из-за того что есть такой тип данных как XML, это не значит, что надо им пользоваться где не попадя.
Далее запрос становится очевидным.
Вам осталось выбрать стратегию передачи табличных данных в вашу функцию. Тут можно и XML-ем воспользоваться. Думаю вам не составит труда сериализировать ваш
List<
string> через
XmlSerializer.
А затем что-то типа:
CREATE FUNCTION [dbo].[fnVideoByKeyWords] (
@KeyWord XML
) RETURNS TABLE AS RETURN (
SELECT V.Video
,V. ... Data ...
FROM dbo.Video V
WHERE Exists( SELECT *
FROM @KeyWord.nodes('/Words/Key') X(K)
JOIN dbo.KeyWord K ON K.Name = X.K.value('@Name') -- X.K.value('text()')
JOIN dbo.VideoKeyWord M ON M.KeyWord = K.KeyWord
WHERE V.Video = M.Video)
)
GO
Далее план запроса в зубы для проверки/допиливания.
На синтаксические ошибки не пинайте - не ставил сиквел на ubuntu ... лень. :)