2013-04-23 1 views
1

다음 SQL Server 2008 쿼리가 있습니다. @Filter 매개 변수가 채워지면 해당 값을 각 필드 (열을 가로 질러)로 전달하도록이를 보강하고 싶습니다. 필터가 없으면 쿼리가 완벽하게 작동합니다. 필자는 필자가 필터를 가져야하는지 잘 모르겠습니다. 어떤 도움이 많이 주시면 감사하겠습니다 :매개 변수가 채워진 경우 필터가있는 SELECT ROW_NUMBER()?

ALTER PROCEDURE [dbo].[pd_Get_Team2] 
@OutTotalRecCount INT OUTPUT, 
@CurrentPage INT, 
@PageSize INT, 
@Token as nvarchar(50), 
@UserID as nvarchar(50), 
@SortDirection INT, 
@SortField nvarchar(50), 
@Filter nvarchar(50) 

AS  
SELECT * FROM   
(SELECT ROW_NUMBER() OVER (
ORDER BY 
CASE WHEN @SortDirection = 1 AND @SortField = 1 THEN pd_Role.UserID END ASC, 
CASE WHEN @SortDirection = 2 AND @SortField = 1 THEN pd_Role.UserID END DESC 
) AS Row, 
pd_Role.id,  
pd_Role.Edit_Rights, 
pd_Role.UserID, 
pd_Role.Is_Approved, 
pd_Role.Login_Date, 
pd_Role.Team 

FROM pd_Role INNER JOIN 
pd_Token ON pd_Role.Token = pd_Token.Token 
WHERE 
(pd_Token.Token = @Token) AND (pd_Token.UserID = @UserID) 

--how do I structure a filter on these fields if the filter is populated? 
--CASE WHEN LEN(@Filter)> 1 
--AND pd_Role.Edit_Rights LIKE '%' + @Filter + '%' OR 
--AND pd_Role.UserID LIKE '%' + @Filter + '%' OR 
--AND pd_Role.Team LIKE '%' + @Filter + '%' 
-- 
) 
    AS TeamWithRowNumbers 
    WHERE Row >= (@CurrentPage - 1) * @PageSize + 1 AND Row <= @CurrentPage*@PageSize  

    SELECT @OutTotalRecCount = COUNT(*) FROM pd_Role 
    WHERE (pd_Role.Token = @Token) 

답변

2

:

WHERE 
(pd_Token.Token = @Token) AND (pd_Token.UserID = @UserID) 

AND (
    pd_Role.Edit_Rights LIKE '%' + @Filter + '%' -- '%' + '' + '%' = Matches all 
    OR pd_Role.UserID LIKE '%' + @Filter + '%' 
    OR pd_Role.Team LIKE '%' + @Filter + '%' 
) 
+0

감사합니다. Serge! 대단합니다! – Rob

+0

다음과 같은 경우 작동하지 않습니다. pd_Role.Edit_Rights, pd_Role.UserID, pd_Role.Team은 NULL 일 수 있습니다. – Serge

+0

null이 아닙니다. 다시 한번 감사드립니다! – Rob

1

이 시도 :

AND ((@Filter IS NULL) OR 
    (pd_Role.Edit_Rights LIKE '%' + @Filter + '%' OR 
    AND pd_Role.UserID LIKE '%' + @Filter + '%' OR 
    AND pd_Role.Team LIKE '%' + @Filter + '%') 
) 

는 공급, 또는 @Filter = ''를 사용하지 않을 때 @Filter가 null 있는지 확인 - 나는 첫 번째 방법을 좋아한다. @filter 결코 NULL이다 (그러나 비어있을 수 있음) 경우

+0

@filter는이 필터를 우회 ''이면? 따라서 where 절 (WHERE (pd_token.Token = @Token) 및 (pd_oken.UserID = @UserID)이 내용을 필터링합니까? – Rob

+0

@Filter가 ''인 경우 AND ((@Filter IS NULL) OR to AND ((@Filter = '')) OR –

+0

실제로 NULL 값 매개 변수를 사용하는 것이 더 좋습니다. –

관련 문제