2012-02-09 98 views
3

即時通訊做一個搜索頁面,我必須用一個文本框搜索多個字段。 ,所以我會得到搜索文本爲CSV串在我的存儲過程sql搜索csv字符串

我的表如下

ID Name   age 
5 bob   23  
6 bod.harry  34  
7 charles  44  

我需要一個SQL查詢,像這樣

declare @searchtext='bob,harry,charley' 
select * from employee where name like (@searchtext) 

此查詢應返回這兩條記錄(編號5和6)

回答

3

可以在存儲過程中使用這種方式,

declare @searchtext varchar(1000) 

set searchtext ='bob,harry,charley' 

declare @filter varchar(2000) 

set @filter = '(name LIKE ''%' + replace('bob,harry,charley',',','%'' OR name LIKE ''%') + '%'')' 

exec 
(' 
    select * 
    from mytab 
    where ' + @filter + ' 
' 
) 
+0

哇!那真是太好了..謝謝你.. – 2012-02-13 06:19:38

0

您需要將@searchtext分解爲多個字符串,每個名稱一個。在TSQL中是可行的,但在應用程序代碼中可能更容易。然後您可以將它們與您的名稱字段進行比較。

+0

此外,批量插入命令可以解析csv文件,因此您可以使用該功能。 – Colin 2012-02-09 08:49:34

3

使用(或修改)這個劃分功能:

ALTER FUNCTION [dbo].CsvToList(@SplitOn char(1), @List varchar(8000)) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY number) AS RowNumber 
      ,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue 
     FROM (
       SELECT @SplitOn + @List + @SplitOn AS ListValue 
      ) AS InnerQuery 
      INNER JOIN master.dbo.spt_values n ON n.Number < LEN(InnerQuery.ListValue) 
     WHERE SUBSTRING(ListValue, number, 1) = @SplitOn 
     AND n.type = 'P' 
); 
GO 

使用

declare @searchtext='bob,harry,charley' 
select DISTINCT * from employee e 
JOIN dbo.csvToList(',', @searchtext) f 
    ON f.ListValue = e.name 
+0

好的UDF!我將這個添加到我的工具箱中,謝謝! – 2013-06-24 23:44:38

0

如果我沒有記錯的SQL Server不支持正則表達式。您可以使用table valued parameters。如果你使用實體框架,你可以這樣做。

var dc = new MyContext(); 
var result = dc.employees.Where(x => new [] { "bob", "harry", "charley" }.Contains(x.name)); 

最後你可能會構造以下

select * from employee where name in (@Param1, @Param2, @Param3, @Param4) 

編輯

我非常不鼓勵你使用,因爲業績下滑(你必須分析你的CSV)和可能性CSV的錯誤(考慮此csv Foo,Bar,"Foo with, comma","comma, "" and quote"

PS如果在分配值時使用表值參數,請使用DataTable作爲源。

0

的[DBO] .CsvToList不會有很多分離的長輸入字符串工作的上述版本。表spt_values其中type ='P'的記錄數量有限。在我的情況下,該函數返回16行而不是66.有人建議用數字創建自己的表。我使用了從其他地方複製的此功能的不同版本:

CREATE FUNCTION [dbo].[fngCsvToList](@SplitOn char(1), @List varchar(8000)) 
RETURNS @Result TABLE (ListValue varchar(100)) 
AS 
BEGIN 
    DECLARE @str VARCHAR(20) 
    DECLARE @ind Int 
    IF(@List is not null) 
    BEGIN 
    SET @List = REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@List)), CHAR(10), ''), CHAR(13), ''), CHAR(9), '') 

     SET @ind = CharIndex(@SplitOn, @List) 
     WHILE @ind > 0 
     BEGIN 
       SET @str = SUBSTRING(@List, 1, @ind-1) 
       SET @List = SUBSTRING(@List, @ind+1, LEN(@List)[email protected]) 
       INSERT INTO @Result values (LTRIM(RTRIM(@str))) 

       SET @ind = CharIndex(',',@List) 
     END 

    SET @str = @List 
     INSERT INTO @Result values (LTRIM(RTRIM(@str))) 
    END 
    RETURN 
END