2015-09-16 128 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:看我编辑的答案... –

相关问题