2015-09-16 2 views
0

я хранимая процедуру для пейджинга и я хав @where я параметр Я должен передать его Постулаты моей SP, как следоватьпрохода Где пункт в качестве параметра хранимой процедуры

Create PROCEDURE SP_hrm_Employee_Paged 
(
     @PageNo INT = 1, 
     @PageSize INT = 10, 
     @where nvarchar(500) 

) 
AS 
BEGIN 
     /*–Declaring Local Variables corresponding to parameters for modification */ 
     DECLARE 

     @lPageNbr INT, 
     @lPageSize INT, 
     @lFirstRec INT, 
     @lLastRec INT, 
     @lTotalRows INT 
     /*Setting Local Variables*/ 
     SET @lPageNbr = @PageNo 
     SET @lPageSize = @PageSize 
     SET @lFirstRec = (@lPageNbr - 1) * @lPageSize 
     SET @lLastRec = (@lPageNbr * @lPageSize + 1) 
     SET @lTotalRows = @lFirstRec - @lLastRec + 1 
     ; WITH CTE_Results 
     AS (
     SELECT ROW_NUMBER() over(ORDER By BranchId ASC) as ROWNUM, 
     Count(*) over() AS TotalCount, 
     EmployeeId, 
     EmployeeFirstName, 
    EmployeeMiddleName, 
    EmployeeLastName, 
    EmployeeMobile, 
    EmployeeMobile2, 
    EmployeeEmail, 
    EmployeeAddress 
    FROM t_hrm_employees 


) 

SELECT 
    TotalCount, 
    ROWNUM, 
      EmployeeId, 
     EmployeeFirstName, 
    EmployeeMiddleName, 
    EmployeeLastName, 
    EmployeeMobile, 
    EmployeeMobile2, 
    EmployeeEmail, 
    EmployeeAddress 

FROM CTE_Results AS CPC 
WHERE 
     ROWNUM > @lFirstRec 
       AND ROWNUM < @lLastRec 
ORDER BY ROWNUM ASC 
END 
+0

Динамический SQL - это способ. – DarkKnight

+0

смотреть на это http://stackoverflow.com/questions/31985175/how-to-execute-sub-query-in-if-exists-condition/31985628#31985628 –

+2

Ощущается как код запах, что некоторые внешние код должен иметь интимное знание запроса внутри этого хранимого proc, чтобы он мог написать разумное предложение where, которое будет работать с ним. Возможно, прочитайте [Условия динамического поиска в T-SQL] (http://www.sommarskog.se/dyn-search.html). Кроме того, в качестве побочного примечания избегайте префикса 'sp_' - он зарезервирован для процедур ** системы ** Microsoft **. –

ответ

1

вы можете использовать динамический SQL, используя SP_EXECUTESQL как это -

Но прежде чем обратите внимание, что - не начинайте свое имя SP с префиксом «sp_», поскольку оно зарезервировано для системной хранимой процедуры на сервере sql.

CREATE PROCEDURE usp_hrm_Employee_Paged (
    @PageNo INT = 1 
    ,@PageSize INT = 10 
    ,@where NVARCHAR(500) 
    ) 
AS 
BEGIN /*–Declaring Local Variables corresponding to parameters for modification */ 
    DECLARE @lPageNbr INT 
     ,@lPageSize INT 
     ,@lFirstRec INT 
     ,@lLastRec INT 
     ,@lTotalRows INT 

    /*Setting Local Variables*/ 
    SET @lPageNbr = @PageNo 
    SET @lPageSize = @PageSize 
    SET @lFirstRec = (@lPageNbr - 1) * @lPageSize 
    SET @lLastRec = (@lPageNbr * @lPageSize + 1) 
    SET @lTotalRows = @lFirstRec - @lLastRec + 1; 

    DECLARE @ExequteSql NVARCHAR(MAX) 

    SET @ExequteSql = N' 
    WITH CTE_Results 
    AS (
     SELECT ROW_NUMBER() OVER (
       ORDER BY BranchId ASC 
       ) AS ROWNUM 
      ,Count(*) OVER() AS TotalCount 
      ,EmployeeId 
      ,EmployeeFirstName 
      ,EmployeeMiddleName 
      ,EmployeeLastName 
      ,EmployeeMobile 
      ,EmployeeMobile2 
      ,EmployeeEmail 
      ,EmployeeAddress 
     FROM t_hrm_employees 
     WHERE ' + @where + ' 
     ) 
    SELECT TotalCount 
     ,ROWNUM 
     ,EmployeeId 
     ,EmployeeFirstName 
     ,EmployeeMiddleName 
     ,EmployeeLastName 
     ,EmployeeMobile 
     ,EmployeeMobile2 
     ,EmployeeEmail 
     ,EmployeeAddress 
    FROM CTE_Results AS CPC 
    WHERE ROWNUM > @lFirstRec 
     AND ROWNUM < @lLastRec 
    ORDER BY ROWNUM ASC' 

    EXEC SP_EXECUTESQL @ExequteSql ,N'@lFirstRec INT, @lLastRec INT' ,@lFirstRec = @lFirstRec ,@lLastRec = @lLastRec 

END 
+0

где я передаю параметр @where? – salah

+0

@salah: см. Мой отредактированный ответ ... –

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