Во-первых, если вам нужно разобрать строки, разделенные запятыми, у вас должна быть функция split. Вот тот, который я использую:
CREATE FUNCTION [dbo].[SplitStrings]
(
@List NVARCHAR(MAX)
)
RETURNS TABLE
AS
RETURN ( SELECT Item FROM (
SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
FROM ( SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, ',', '</i><i>')
+ '</i>').query('.') ) AS a
CROSS APPLY [XML].nodes('i') AS x(i)
) AS y WHERE Item IS NOT NULL
);
GO
Теперь, если вы хотите выбрать произвольное совпадение в случае нескольких совпадений, вы можете сказать:
CREATE PROCEDURE dbo.Search
@SearchStrings NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
;WITH x AS (
SELECT e.empid, e.empname, e.sal, SearchString = s.Item,
rn = ROW_NUMBER() OVER (PARTITION BY e.empid ORDER BY s.Item)
FROM dbo.emp AS e
INNER JOIN dbo.SplitStrings(@SearchStrings) AS s
ON e.empname LIKE '%' + s.Item + '%'
)
SELECT empid, empname, sal, SearchString
FROM x WHERE rn = 1 ORDER BY empid;
END
GO
(Это вернет первое алфавитное совпадение в вашем параметре @SearchStrings
, а не первое совпадение в порядке вашей строки, разделенной запятыми.)
Если вам просто нужны все строки, даже если сотрудник использует более одного из переданных шаблонов (что означает, что 'john'
будет возвращено дважды, если ваш параметр 'jo,oh'
), вы можете просто сказать:
CREATE PROCEDURE dbo.Search
@SearchStrings NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT e.empid, e.empname, e.sal, SearchString = s.Item
FROM dbo.emp AS e
INNER JOIN dbo.SplitStrings(@SearchStrings) AS s
ON e.empname LIKE '%' + s.Item + '%'
ORDER BY empid;
END
GO
Если вам нужен разделенный запятыми список совпадений в тех случаях, когда сотруднику соответствует несколько шаблонов, укажите это в своих требованиях. Это немного больше работы, чтобы сделать это.