mssql分頁存儲過程



/********** 通用分頁存儲過程  返回的數據中總是在每條記錄前加上行號RowNumber列 ***************/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_common_pager]
 @strSelect NVARCHAR(4000) = '*' ,   --顯示的列(多列用逗號分開),例如:id,name;  如果未指定@StrSelect參數,相當於設置它爲'*'
 @strFrom NVARCHAR(4000) ,           --表名稱,或者是表連接字符串,多表連接例如:student as s inner join dwinfo as dw on s.dwbh=dw.bh  ;如果未指定@StrFrom參數,不做查詢,返回-1 
 @strWhere NVARCHAR(4000) = '' ,     --查詢條件,''代表沒有條件,單條件或者多條件,多條件例如:name='啊' and id=10;  如果未指定@StrWhere參數,則忽略Where條件
 @strOrder NVARCHAR(4000) ,          --排序列(多個排序列用逗號分開),例如:id desc,name asc;   如果未指定@StrOrder參數,試着自動獲得標識列作爲@StrOrder,失敗則不做查詢,返回-1
 @pageSize INT = 0 ,                 --每頁顯示條數;  如果未指定@PageSize參數,或者它<=0,則返回全部記錄
 @pageIndex INT = 1 ,                --當前頁;  如果未指定@PageIndex參數,會設置它爲1,顯示第一頁數據 
 @isStats BIT = 0 ,                  --非0則統計,爲0則不統計(統計會影響效率)
 @rowCount BIGINT = -1 OUTPUT     --返回當前頁記錄數 
AS   


BEGIN  
    SET NOCOUNT ON ;  
    IF @StrFrom IS NULL   
        BEGIN  
            RETURN -1  
        END  
    --若沒有指定@StrOrder,試着獲取標識列  
    IF @StrOrder IS NULL   
        BEGIN  
            DECLARE @identitycol NVARCHAR(50)  
            SET @identitycol = ( SELECT TOP ( 1 )  
                                        COLUMN_NAME  
                                 FROM   INFORMATION_SCHEMA.columns  
                                 WHERE  TABLE_NAME = @StrFrom  
                                        AND COLUMNPROPERTY(
OBJECT_ID(@StrFrom), 
COLUMN_NAME, 
'IsIdentity') = 1  
                               )  
            IF @identitycol IS NULL --沒有Order By和標識列  
                BEGIN  
                    RETURN -1  
                END  
                  
            SET @StrOrder = @identitycol  
        END  
    DECLARE @SqlQuery NVARCHAR(4000)  
      
    IF ( @PageSize <= 0 )   
    BEGIN          
IF ( @StrWhere = '' )
BEGIN  
SET @SqlQuery=N'SELECT ROW_NUMBER() OVER(ORDER BY ' + @StrOrder  
                        + ' ) AS RowNumber,' + @StrSelect + ' FROM '  
                        + @StrFrom;  
END  
ELSE
BEGIN
SET @SqlQuery=N'SELECT ROW_NUMBER() OVER(ORDER BY ' + @StrOrder  
                        + ' ) AS RowNumber,' + @StrSelect + ' FROM '  
                        + @StrFrom + ' WHERE ' + @StrWhere;  
END
        GOTO LABEL_EXEC                              
    END  
    IF ( @PageIndex = 1 )   
        BEGIN  
            IF ( @StrWhere = '' )   
                BEGIN  
                    SET @SqlQuery = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize)  
                        + ' ROW_NUMBER() OVER(ORDER BY ' + @StrOrder  
                        + ' ) AS RowNumber,' + @StrSelect + ' FROM '  
                        + @StrFrom ;  
                END  
            ELSE   
                BEGIN  
                    SET @SqlQuery = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize)  
                        + ' ROW_NUMBER() OVER(ORDER BY ' + @StrOrder  
                        + ' ) AS RowNumber,' + @StrSelect + ' FROM '  
                        + @StrFrom + ' WHERE ' + @StrWhere ;  
                END  
        END  
    ELSE   
        BEGIN  
            IF ( @StrWhere = '' )   
                BEGIN  
                    SET @SqlQuery = N'WITH CTE AS (SELECT ROW_NUMBER() OVER(ORDER BY ' 
+ @StrOrder + ' ) AS RowNumber,' + @StrSelect + ' FROM ' 
+ @StrFrom + ') SELECT * FROM CTE WHERE ROWNUMBER BETWEEN ' 
+ CONVERT(NVARCHAR, ( ( @PageIndex - 1 ) * @PageSize ) + 1) 
+ ' AND ' + CONVERT(NVARCHAR, @PageIndex * @PageSize)             
                END  
            ELSE   
                BEGIN  
        
                    SET @SqlQuery = N'WITH CTE AS (SELECT ROW_NUMBER() OVER(ORDER BY ' 
+ @StrOrder + ' ) AS RowNumber,' + @StrSelect + ' FROM ' 
+ @StrFrom + ' WHERE ' + @StrWhere 
+ ') SELECT * FROM CTE WHERE ROWNUMBER BETWEEN ' 
+ CONVERT(NVARCHAR, ( ( @PageIndex - 1 ) * @PageSize ) + 1) 
+ ' AND ' + CONVERT(NVARCHAR, @PageIndex * @PageSize)  
                END  
        END 
        
LABEL_EXEC:


    DECLARE @StrCount NVARCHAR(1000)
    IF (@IsStats != 0) 
BEGIN
IF (@StrWhere != '')
BEGIN
SET @StrCount = 'SET @NUM=(SELECT COUNT(0) FROM ' + @StrFrom + ' WHERE ' + @StrWhere + ')'
END
ELSE
BEGIN
SET @StrCount = 'SET @NUM=(SELECT COUNT(0) FROM ' + @StrFrom + ')'
END
EXECUTE SP_EXECUTESQL @strCount ,N'@NUM INT OUTPUT',@RowCount OUTPUT
END
EXEC (@SqlQuery)
END  




/****** Object:  StoredProcedure [dbo].[sp_get_MenuByAcct]    Script Date: 06/15/2012 11:17:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_get_MenuByAcct](
@acctID INT = 0     --用戶ID 
)
AS   


BEGIN 
SET NOCOUNT ON ;    
SELECT a.func_id id,b.func_nm [name],b.page_id childNode,c.parent_id parentNode,c.page_url url FROM  
(SELECT func_id FROM adm_acct_func WHERE acct_id = @acctID) AS a
INNER JOIN (SELECT func_id,func_nm,page_id FROM adm_func WHERE is_left_menu = 1) AS b
ON a.func_id = b.func_id
INNER JOIN adm_page AS c
ON b.page_id = c.page_id  
UNION
SELECT 0 id,p.page_nm [name],t.parent_id childNode,p.parent_id parentNode,p.page_url url FROM(
SELECT c.parent_id FROM (SELECT func_id FROM adm_acct_func WHERE acct_id = @acctID) AS a
INNER JOIN (SELECT func_id,func_nm,page_id FROM adm_func WHERE is_left_menu = 1) AS b
ON a.func_id = b.func_id
INNER JOIN adm_page AS c
ON b.page_id = c.page_id
) AS t
INNER JOIN adm_page AS p
ON t.parent_id = p.page_id AND p.parent_id = 0
ORDER BY id ASC, childNode DESC;
END




/****** Object:  StoredProcedure [dbo].[sp_get_LoginByAcct]    Script Date: 06/15/2012 13:16:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_get_LoginByAcct](
@logName  CHAR(32), -- 用戶名
@logWord  CHAR(64), -- 密碼(經過加密的)
@logIP    CHAR(15) -- IP
)
AS   


BEGIN 
SET NOCOUNT ON ;    
IF ((SELECT COUNT(0) FROM adm_acct WHERE log_nm = @logName AND log_psd = @logWord AND valid = 1) > 0)
BEGIN
UPDATE adm_acct SET log_dt = CURRENT_TIMESTAMP WHERE log_nm = @logName;
INSERT INTO adm_log (rec_dt, acct_id, opt_cont)
SELECT log_dt, acct_id, '通過IP[' + @logIP + ']登陸系統' FROM adm_acct WHERE log_nm = @logName AND log_psd = @logWord AND valid = 1;
END
SELECT a.acct_id, a.acct_nm, a.log_nm, a.mobile, a.email, a.im_nm, a.sap_sale_id, a.sap_tech_id, a.staff_id, a.sap_usr_type,
  ISNULL(b.staff_nm,'') staff_nm, ISNULL(b.staff_no,0) staff_no, ISNULL(b.dep_id,0) dep_id, 
  ISNULL(b.post_id,0) post_id, ISNULL(b.id_card,'') id_card, ISNULL(c.dep_nm,'') dep_nm, ISNULL(d.post_nm,'') post_nm
FROM adm_acct AS a 
LEFT JOIN base_staff AS b ON a.staff_id = b.staff_id
LEFT JOIN base_dep AS c  ON b.dep_id = c.dep_id
LEFT JOIN base_post AS d ON b.post_id = d.post_id
WHERE a.log_nm = @logName AND a.log_psd = @logWord AND a.valid = 1;
END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章