首先,如果你需要解析逗號分隔的字符串,你應該有一個分流的功能。下面是我使用的一個:
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
參數,而不是按逗號分隔的字符串順序排列的第一個匹配項。)
如果你只是希望所有的行,即使僱員出現在圖案傳遞的(這意味着如果你的參數是'jo,oh'
'john'
將返回兩次)的不止一個,你可以說:
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
如果在多個模式與員工匹配的情況下需要用逗號分隔的匹配列表,請在您的要求中說明。這要做更多的工作。
您當前的where子句不會返回這兩行中的任何一行 - 「'john''與''%jo%''和''%el%''不同。我想你的意思是用'OR'而不是'AND'。你也可以指定你使用的是哪個版本的SQL Server? – 2012-02-19 15:51:14
如果搜索字符串是'jo''和''oh'',你會想要什麼,它會匹配兩次john''?你想要兩行嗎,你想要「jo,el''要退還嗎?還是你想要選擇一個任意的? – 2012-02-19 16:01:24