2012-02-09 2 views
3

메신저 검색 페이지에서 단일 텍스트 상자로 여러 필드를 검색해야합니다. 내가이csv 문자열에서 sql 검색

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

이 쿼리해야 같은 SQL 쿼리의 뭔가가 필요

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

다음과 같이 는 그래서 난

내 테이블 내 저장 프로 시저의 CSV 문자열로 검색 텍스트를 얻을 것이다 이 레코드 (id 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

와우! 정말 좋았어 .. 고마워 .. –

0

@searchtext는 각 이름에 대해 하나씩 여러 문자열로 나눠야합니다. TSQL에서는 가능하지만 응용 프로그램 코드에서는 더 쉬울 수 있습니다. 그런 다음 이름 필드와 비교할 수 있습니다.

+0

또한 Bulk Insert 명령은 CSV 파일을 구문 분석 할 수 있으므로 아마도이 파일을 사용할 수 있습니다. – Colin

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! 나는 이것을 도구 상자에 추가하고있다. 고마워! –

0

내가 잘못 SQL-Server를 정규식을 지원하지 않습니다 아니에요합니다. table valued parameters을 사용할 수 있습니다. Entity 프레임 워크를 사용한다면 그렇게 할 수 있습니다.

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

그리고 마지막으로 당신은

내가보기 엔 당신 때문에 성능 저하 (당신이 당신의 CSV를 구문 분석 할 필요) 및 가능성에 CSV를 사용하는 낙담 다음

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

편집을 구성 할 수 오류 수 (고려해 본 CSV Foo,Bar,"Foo with, comma","comma, "" and quote")

PS 값을 지정할 때 테이블 값 매개 변수를 사용하는 경우 DataTable을 소스로 사용하십시오.

0

[DBO] 분리기의 많은 긴 입력 문자열 작동하지 않습니다 .CsvToList의 위의 버전. 테이블 spt_values ​​여기서 type = 'P'는 레코드 수가 제한되어 있습니다. 필자의 경우 함수는 66 행 대신 16 행을 반환했다. 일부는 숫자가있는 자체 테이블을 만들 것을 권고한다. 다른 곳에서 복사 한이 함수의 다른 버전을 사용했습니다.

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 
관련 문제