2012-02-09 32 views
3

私は単一のテキストボックスで複数のフィールドを検索する必要がある検索ページを行っています。 私のストアドプロシージャcsv文字列からのSQL検索

私のテーブル内のCSV文字列は、私はこのクエリこの

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  

を下回っているように、私は、検索テキストを取得する必要がありますこの両方のレコードを返す(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は、@searchtextを各名前ごとに1つずつ複数の文字列に分割する必要があります。これはTSQLで実行可能ですが、アプリケーションコードのほうが簡単かもしれません。それらをあなたのNameフィールドと比較することができます。

+0

また、一括挿入コマンドは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) 

EDIT

を構築するかもしれませんエラーを考慮してください(この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