0

指定されたキーワードを含むレコードを返すこのストアドプロシージャがあります。

CREATE procedure [dbo].[SearchKeywordPaged](
    @KeyWordFilter varchar(50)
    ,@PageNumber int = 1)      

as
begin

declare @PageSize int = 50
declare @FirstRow int
declare @LastRow int
declare @TotalRows int

SELECT      @FirstRow = (@PageNumber - 1) * @PageSize + 1,
            @LastRow = (@PageNumber - 1) * @PageSize + @PageSize;

select @TotalRows =      COUNT(*) from 
    [Quotes] q inner join [Keywords] k 
    ON q.id = k.Quoteid where k.Keyword = @KeyWordFilter;

with Results as
(                  
    SELECT            
        q.*
        ,ROW_NUMBER() over (Order By Author asc) as Instance_Count
        ,@TotalRows as the_Count
    FROM [Quotes] q
    INNER JOIN [Keywords] k ON q.id = k.Quoteid
    WHERE k.Keyword = @KeyWordFilter
)            

select      *
from      results
where      Instance_Count between @FirstRow and @LastRow
order by Instance_Count asc

end

このストアドプロシージャを変更して、検索に複数のキーワードを受け入れるにはどうすればよいですか?

4

2 に答える 2

1

文字列をテーブルに変換する関数を作成します。以下の例を使用できます。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_SplitString]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_SplitString]
GO
CREATE   FUNCTION [dbo].[fn_SplitString]    (@xStr varchar(8000))
RETURNS @out table (
    x varchar(500))  AS  
begin

declare @lp int set @lp=1
declare @xlen int
set @xlen=len(@xstr)

declare @xchar char(1)
declare @thisSplit varchar(50)
set @thisSplit=''

while @lp <= @xlen
 begin
    set @xchar=substring(@xstr,@lp,1)

    set @thisSplit=@thisSplit + @xchar

        if (@xchar=',') or (@lp=@xlen)
         begin
            insert into @out (x) values (replace(@thisSplit,',',''))
            set @thisSplit=''
         end
    set @lp=@lp+1   
 end


RETURN  
end
GO
select X from fn_SplitString('aaa,bbb,cccc')

次に、WHEREストアドプロシージャの句を次のように変更します。

WHERE k.Keyword in (select x from fn_SplitString(@KeyWordFilter) ) 

最後に、次のように、キーワードのリストをコンマ区切りのリストとして渡すSPを使用できます。

exec [SearchKeywordPaged]  @KeyWordFilter='keyword1,keyword2,...'
于 2013-01-26T23:50:10.060 に答える
0

おそらく、ストアドプロシージャで何か動的なことをしなければなりません。例えば:

declare @keywords varchar(50);
declare @sql  varchar(256);

-- @keywords is defined locally here, but it would be passed into your proc.
-- these are all single quotes.
select @keywords = ' ''keyword1'', ''keyword2'', ''keyword3'' '

select @sql = 'select * from a_table where keyword in (' + @keywords + ')'
exec(@sql)
于 2013-01-26T23:37:03.610 に答える