2015-09-16 127 views
0

我已存儲的程序分頁和我HAVA放慢參數@where我需要通過它來statment我的SP如下通Where子句作爲參數傳遞給存儲過程

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

感覺就像一個代碼味道,一些外部代碼必須對這個存儲過程中的查詢有深入的瞭解,以便它可以編寫一個合理的where子句來處理它。也許閱讀[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html)。另外,作爲一個附註,避免'sp_'前綴 - 它被保留用於微軟的**系統**程序。 –

回答

1

您可以使用SP_EXECUTESQL使用動態SQL像這樣 -

但之前請注意 - 不要使用「sp_」前綴開始您的SP名稱,因爲它保留用於SQL Server中的系統存儲過程。

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:看我編輯的答案... –

相關問題