帖几个SQL存储过程!

  1 -- TOP n 实现的通用分页存储过程
  2 CREATE   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              -- 总页数
 12 AS
 13 SET  NOCOUNT  ON
 14 -- 检查对象是否有效
 15 IF   OBJECT_ID ( @tbname IS   NULL
 16 BEGIN
 17      RAISERROR (N ' 对象"%s"不存在 ' , 1 , 16 , @tbname )
 18      RETURN
 19 END
 20 IF   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
 23 BEGIN
 24      RAISERROR (N ' "%s"不是表、视图或者表值函数 ' , 1 , 16 , @tbname )
 25      RETURN
 26 END
 27
 28 -- 分页字段检查
 29 IF   ISNULL ( @FieldKey ,N '' ) = ''
 30 BEGIN
 31      RAISERROR (N ' 分页处理需要主键(或者惟一键) ' , 1 , 16 )
 32      RETURN
 33 END
 34
 35 -- 其他参数检查及规范
 36 IF   ISNULL ( @PageCurrent , 0 ) < 1   SET   @PageCurrent = 1
 37 IF   ISNULL ( @PageSize , 0 ) < 1   SET   @PageSize = 10
 38 IF   ISNULL ( @FieldShow ,N '' ) = N ''   SET   @FieldShow = N ' * '
 39 IF   ISNULL ( @FieldOrder ,N '' ) = N ''
 40      SET   @FieldOrder = N ''
 41 ELSE
 42      SET   @FieldOrder = N ' ORDER BY  ' + LTRIM ( @FieldOrder )
 43 IF   ISNULL ( @Where ,N '' ) = N ''
 44      SET   @Where = N ''
 45 ELSE
 46      SET   @Where = N ' WHERE ( ' + @Where + N ' ) '
 47
 48 -- 如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
 49 IF   @PageCount   IS   NULL
 50 BEGIN
 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
 57 END
 58
 59 -- 计算分页显示的TOPN值
 60 DECLARE   @TopN   varchar ( 20 ), @TopN1   varchar ( 20 )
 61 SELECT   @TopN = @PageSize ,
 62      @TopN1 = ( @PageCurrent - 1 ) * @PageSize
 63
 64 -- 第一页直接显示
 65 IF   @PageCurrent = 1
 66      EXEC (N ' SELECT TOP  ' + @TopN
 67          + N '   ' + @FieldShow
 68          + N '  FROM  ' + @tbname
 69          + N '   ' + @Where
 70          + N '   ' + @FieldOrder )
 71 ELSE
 72 BEGIN
 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 )
110 END


 1 --  字符串缓存实现的通用分页存储过程(转)
 2 CREATE   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             -- 总页数
12 AS
13 DECLARE   @sql   nvarchar ( 4000 )
14 SET  NOCOUNT  ON
15 -- 检查对象是否有效
16 IF   OBJECT_ID ( @tbname IS   NULL
17 BEGIN
18      RAISERROR (N ' 对象"%s"不存在 ' , 1 , 16 , @tbname )
19      RETURN
20 END
21 IF   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
24 BEGIN
25      RAISERROR (N ' "%s"不是表、视图或者表值函数 ' , 1 , 16 , @tbname )
26      RETURN
27 END
28
29 -- 分页字段检查
30 IF   ISNULL ( @FieldKey ,N '' ) = ''
31 BEGIN
32      RAISERROR (N ' 分页处理需要主键(或者惟一键) ' , 1 , 16 )
33      RETURN
34 END
35
36 -- 其他参数检查及规范
37 IF   ISNULL ( @PageCurrent , 0 ) < 1   SET   @PageCurrent = 1
38 IF   ISNULL ( @PageSize , 0 ) < 1   SET   @PageSize = 10
39 IF   ISNULL ( @FieldShow ,N '' ) = N ''   SET   @FieldShow = N ' * '
40 IF   ISNULL ( @FieldOrder ,N '' ) = N ''
41      SET   @FieldOrder = N ''
42 ELSE
43      SET   @FieldOrder = N ' ORDER BY  ' + LTRIM ( @FieldOrder )
44 IF   ISNULL ( @Where ,N '' ) = N ''
45      SET   @Where = N ''
46 ELSE
47      SET   @Where = N ' WHERE ( ' + @Where + N ' ) '
48
49 -- 如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
50 IF   @PageCount   IS   NULL
51 BEGIN
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
57 END
58
59 -- 计算分页显示的TOPN值
60 DECLARE   @TopN   varchar ( 20 ), @TopN1   varchar ( 20 )
61 SELECT   @TopN = @PageSize ,
62      @TopN1 = @PageCurrent * @PageSize     
63
64 -- 第一页直接显示
65 IF   @PageCurrent = 1
66      EXEC (N ' SELECT TOP  ' + @TopN
67          + N '   ' + @FieldShow
68          + N '  FROM  ' + @tbname
69          + N '   ' + @Where
70          + N '   ' + @FieldOrder )
71 ELSE
72 BEGIN
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
99 END


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

http://topic.csdn.net/u/20080325/14/d25ada1e-979e-49ef-95b6-8ebf114d2fca.html

转载于:https://www.cnblogs.com/Kevan/archive/2008/05/25/1206746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值