2013-04-23 3 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

если @Filter никогда не NULL (но может быть пустым):

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

Они никогда не являются нулевыми. Еще раз спасибо! – 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 = '' - Мне нравится первый подход.

+0

Если @Filter является '' это будет обходить фильтры? так что только предложение where (WHERE (pd_Token.Token = @Token) И (pd_Token.UserID = @UserID) фильтрует контент? – Rob

+0

Если @Filter is '', вам придется изменить AND ((@Filter IS NULL) ИЛИ AND ((@Filter = '') ИЛИ –

+0

Просто я предпочитаю работать с параметрами NULL, когда они на самом деле не имеют значения. –

Смежные вопросы