帖几个SQL存储过程!

  1--TOP n 实现的通用分页存储过程
  2CREATE PROC sp_PageView
  3@tbname     sysname,               --要分页显示的表名
  4@FieldKey   nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
  5@PageCurrent int=1,               --要显示的页码
  6@PageSize   int=10,                --每页的大小(记录数)
  7@FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
  8@FieldOrder nvarchar(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
  9                                          用于指定排序顺序
 10@Where    nvarchar(1000)='',     --查询条件
 11@PageCount int OUTPUT             --总页数
 12AS
 13SET NOCOUNT ON
 14--检查对象是否有效
 15IF OBJECT_ID(@tbnameIS NULL
 16BEGIN
 17    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
 18    RETURN
 19END
 20IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
 21    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
 22    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
 23BEGIN
 24    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
 25    RETURN
 26END
 27
 28--分页字段检查
 29IF ISNULL(@FieldKey,N'')=''
 30BEGIN
 31    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
 32    RETURN
 33END
 34
 35--其他参数检查及规范
 36IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
 37IF ISNULL(@PageSize,0)<1 SET @PageSize=10
 38IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
 39IF ISNULL(@FieldOrder,N'')=N''
 40    SET @FieldOrder=N''
 41ELSE
 42    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
 43IF ISNULL(@Where,N'')=N''
 44    SET @Where=N''
 45ELSE
 46    SET @Where=N'WHERE ('+@Where+N')'
 47
 48--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
 49IF @PageCount IS NULL
 50BEGIN
 51    DECLARE @sql nvarchar(4000)
 52    SET @sql=N'SELECT @PageCount=COUNT(*)'
 53        +N' FROM '+@tbname
 54        +N' '+@Where
 55    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
 56    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
 57END
 58
 59--计算分页显示的TOPN值
 60DECLARE @TopN varchar(20),@TopN1 varchar(20)
 61SELECT @TopN=@PageSize,
 62    @TopN1=(@PageCurrent-1)*@PageSize
 63
 64--第一页直接显示
 65IF @PageCurrent=1
 66    EXEC(N'SELECT TOP '+@TopN
 67        +N' '+@FieldShow
 68        +N' FROM '+@tbname
 69        +N' '+@Where
 70        +N' '+@FieldOrder)
 71ELSE
 72BEGIN
 73    --处理别名
 74    IF @FieldShow=N'*'
 75        SET @FieldShow=N'a.*'
 76
 77    --生成主键(惟一键)处理条件
 78    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
 79        @s nvarchar(1000),@Field sysname
 80    SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
 81    WHILE CHARINDEX(N',',@s)>0
 82        SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
 83            @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
 84            @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
 85            @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
 86            @Where=REPLACE(@Where,@Field,N'a.'+@Field),
 87            @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
 88            @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
 89    SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
 90        @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
 91        @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
 92        @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),    
 93        @Where2=CASE
 94            WHEN @Where='' THEN N'WHERE ('
 95            ELSE @Where+N' AND ('
 96            END+N'b.'+@s+N' IS NULL'+@Where2+N')'
 97
 98    --执行查询
 99    EXEC(N'SELECT TOP '+@TopN
100        +N' '+@FieldShow
101        +N' FROM '+@tbname
102        +N' a LEFT JOIN(SELECT TOP '+@TopN1
103        +N' '+@FieldKey
104        +N' FROM '+@tbname
105        +N' a '+@Where
106        +N' '+@FieldOrder
107        +N')b ON '+@Where1
108        +N' '+@Where2
109        +N' '+@FieldOrder)
110END


 1-- 字符串缓存实现的通用分页存储过程(转)
 2CREATE PROC sp_PageView
 3@tbname     sysname,               --要分页显示的表名
 4@FieldKey   sysname,               --用于定位记录的主键(惟一键)字段,只能是单个字段
 5@PageCurrent int=1,                 --要显示的页码
 6@PageSize   int=10,                --每页的大小(记录数)
 7@FieldShow  nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
 8@FieldOrder  nvarchar(1000)='',     --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
 9                                          用于指定排序顺序
10@Where     nvarchar(1000)='',      --查询条件
11@PageCount  int OUTPUT            --总页数
12AS
13DECLARE @sql nvarchar(4000)
14SET NOCOUNT ON
15--检查对象是否有效
16IF OBJECT_ID(@tbnameIS NULL
17BEGIN
18    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
19    RETURN
20END
21IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
22    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
23    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
24BEGIN
25    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
26    RETURN
27END
28
29--分页字段检查
30IF ISNULL(@FieldKey,N'')=''
31BEGIN
32    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
33    RETURN
34END
35
36--其他参数检查及规范
37IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
38IF ISNULL(@PageSize,0)<1 SET @PageSize=10
39IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
40IF ISNULL(@FieldOrder,N'')=N''
41    SET @FieldOrder=N''
42ELSE
43    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
44IF ISNULL(@Where,N'')=N''
45    SET @Where=N''
46ELSE
47    SET @Where=N'WHERE ('+@Where+N')'
48
49--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
50IF @PageCount IS NULL
51BEGIN
52    SET @sql=N'SELECT @PageCount=COUNT(*)'
53        +N' FROM '+@tbname
54        +N' '+@Where
55    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
56    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
57END
58
59--计算分页显示的TOPN值
60DECLARE @TopN varchar(20),@TopN1 varchar(20)
61SELECT @TopN=@PageSize,
62    @TopN1=@PageCurrent*@PageSize    
63
64--第一页直接显示
65IF @PageCurrent=1
66    EXEC(N'SELECT TOP '+@TopN
67        +N' '+@FieldShow
68        +N' FROM '+@tbname
69        +N' '+@Where
70        +N' '+@FieldOrder)
71ELSE
72BEGIN
73    SELECT @PageCurrent=@TopN1,
74        @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
75            +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
76            +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
77            +N' '+@Where
78            +N' '+@FieldOrder
79    SET ROWCOUNT @PageCurrent
80    EXEC sp_executesql @sql,
81        N'@n int,@s nvarchar(4000) OUTPUT',
82        @PageCurrent,@sql OUTPUT
83    SET ROWCOUNT 0
84    IF @sql=N''
85        EXEC(N'SELECT TOP 0'
86            +N' '+@FieldShow
87            +N' FROM '+@tbname)
88    ELSE
89    BEGIN
90        SET @sql=STUFF(@sql,1,1,N'')        
91        --执行查询
92        EXEC(N'SELECT TOP '+@TopN
93            +N' '+@FieldShow
94            +N' FROM '+@tbname
95            +N' WHERE '+@FieldKey
96            +N' IN('+@sql
97            +N''+@FieldOrder)
98    END
99END


 1--使用系统存储过程实现的通用分页存储过程
 2CREATE PROC sp_PageView   
 3@sql         ntext,     --要执行的sql语句
 4@PageCurrent int=1,     --要显示的页码
 5@PageSize    int=10,    --每页的大小
 6@PageCount   int OUTPUT --总页数
 7AS
 8SET NOCOUNT ON
 9DECLARE @p1 int
10--初始化分页游标
11EXEC sp_cursoropen 
12    @cursor=@p1 OUTPUT,
13    @stmt=@sql,
14    @scrollopt=1,
15    @ccopt=1,
16    @rowcount=@PageCount OUTPUT
17
18--计算总页数
19IF ISNULL(@PageSize,0)<1 
20    SET @PageSize=10
21SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
22IF ISNULL(@PageCurrent,0)<1 OR ISNULL(@PageCurrent,0)>@PageCount
23    SET @PageCurrent=1
24ELSE
25    SET @PageCurrent=(@PageCurrent-1)*@PageSize+1
26
27--显示指定页的数据
28EXEC sp_cursorfetch @p1,16,@PageCurrent,@PageSize
29
30--关闭分页游标
31EXEC sp_cursorclose @p1

http://topic.csdn.net/u/20080325/14/d25ada1e-979e-49ef-95b6-8ebf114d2fca.html
posted @ 2008-05-25 00:54  Kevan  阅读(217)  评论(0编辑  收藏  举报