我是一个菜鸟,我只是在努力,2021正视自己,面对2021!

浅谈SQL Server所实现创建分页功能的存储过程的分析及代码

1 SQL Server分页说明

  在这里我们能看到一种使用sql存储过程写的数据控件分页功能,不管给开发工具中的那个数据控件,都只要调用这个存储过程就可以实现这样的方法了,简单吧,我们再也不用在各个页面都写很多的SQL语句了。Misrosoft  SQL Server是微软开发的一种管理数据的数据库,现在世面上面最流行的几款数据库是Access,SQL Server, MySQl,Oracl数据库,所谓这些数据库,只要你学会一个数据库的语法等,其他的你都就大致会使用了,现在就我学习的SQL Server我在这里大致写写, 我们已经学习了一年了,我们学到了什么呢?我自我问了一下,我发现我真的什么都没有学到。除了写个创建表啊,执行简单的Sql语句,写简单的存储过程,我们写过函数吗?写过SQL的一些高级的东西吗?就是简单的存储过程,都是我们自己随手写出来的吗,还要查资料,要是真正自己写呢,我就不能说了?????????,所以我们学习的东西还有很多呢,我们要坚持,坚持就是胜利。

2 SQL Server存储过程分页

  下面就是支持数据分页的存储过程,值得研究一下,当然,我们要认真的看,才能从中学到好多东西哦。

  创建存储过程:  

 1 --获取分页的总共数据的信息
 2 
 3 create procedure p_PageList
 4 
 5 (
 6 
 7 @TableName nvarchar(300),  --你所要分页的表名
 8 
 9 @PKey nvarchar(50),        --主键 默认ID
10 
11 @FieldList nvarchar(500),  --需要搜索的字段
12 
13 @Condition nvarchar(1000), --条件,搜索什么条件
14 
15 @OrderBy nvarchar(250),    --排序Order By ID
16 
17 @Sql nvarchar(1000),       --可以使用,也可以不使用,程序可以自动生成sql语句,当然,那样只能简单的查出来所需要的信息
18 
19 @SqlGetRC nvarchar(1000),  --得到总的sql语句,也可以不使用,也可以指定
20 
21 @CurrPage int,             --当前你所查看的那一页
22 
23 @PageSize int,             --每页所要现实的数目
24 
25 @RecordCount int,          --获取数据库中数据的总数目,可以传,也可以不传
26 
27 @result int output         --输出参数
28 
29 )
30 
31 as
32 
33 declare @PageCount int
34 
35 if @SqlGetRC=''  --如果总的数据sql语句为空
36 
37 Set @SqlGetRC='Select @RecordCount=COUNT(0) FROM '+@TableName+@Condition
38 
39 if @RecordCount=-1  --
40 
41 begin
42 
43 exec sp_executesql @SqlGetRC,N'@RecordCount int out',@RecordCount out
44 
45 end
46 
47 Set @PageCount=(@RecordCount+@PageSize-1)/@PageSize
48 
49 if @CurrPage>@PageCount AND @PageCount>0
50 
51 Set @CurrPage=@PageCount
52 
53  
54 
55 if @Sql=''
56 
57 begin
58 
59     if @PageSize=0
60 
61        set @PageSize=10
62 
63     if @CurrPage=1
64 
65        Set @Sql='select top '+Cast(@PageSize as nvarchar)+' '+@FieldList+' FROM '+@TableName+@Condition+' '+@OrderBy
66 
67     else
68 
69        Set @Sql='select top '+Cast(@PageSize as nvarchar)+' '+@FieldList+' FROM '+@TableName+' WHERE ' +@Pkey+' NOT IN (SELECT TOP '+Cast((@CurrPage-1)*@PageSize as nvarchar)+' '+@Pkey+' FROM '++ ' ' + @Condition + ' ' + @OrderBy + ') ' + replace(@Condition,' WHERE 1=1',' ') + ' ' + @OrderBy
70 
71 end
72 
73 exec(@Sql)
74 
75 Select RecordCount=@RecordCount,PageCount=@PageCount
76 
77 Set  @Result=1

3 知识点总结

  1:sp_executesql  执行可以多次重复使用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。

    备注:在批处理、名称作用域和数据库上下文方面,sp_executesql 与 EXECUTE 的行为相同。sp_executesql stmt 参数中的 Transact-SQL 语句或批处理在执行 sp_executesql 语句时才编译。随后,将编译 stmt 中的内容,并将其作为执行计划运行。该执行计划独立于名为 sp_executesql 的批处理的执行计划。sp_executesql 批处理不能引用调用 sp_executesql 的批处理中声明的变量。sp_executesql 批处理中的本地游标或变量对调用 sp_executesql 的批处理是不可见的。对数据库上下文所作的更改只在 sp_executesql 语句结束前有效。

    如果只更改了语句中的参数值,则 sp_executesql 可用来代替存储过程多次执行 Transact-SQL 语句。因为 Transact-SQL 语句本身保持不变,仅参数值发生变化,所以 SQL Server 查询优化器可能重复使用首次执行时所生成的执行计划。

  2:Cast  将一种数据类型的表达式显式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能。

  3:replace 将第一个字符串表达式中第二个给定字符串表达式的所有实例都替换为第三个表达式。

    语法:REPLACE ( 'string_expression1' , 'string_expression2' ,'string_expression3' )

    ' string_expression1 ':要搜索的字符串表达式。string_expression1 参数的数据类型可以是可隐式转换为 nvarchar ntext 的数据类型。

    ' string_expression2 ':尝试查找的字符串表达式。string_expression2 参数的数据类型可以是可隐式转换为 nvarchar ntext 的数据类型。

    ' string_expression3 ':替换字符串表达式。string_expression3 参数的数据类型可以是可隐式转换为 nvarchar ntext 的数据类型。

  返回值

    nvarcharntext  如果任意参数为 NULL,则返回 NULL。

  示例

    下面的示例在产品名称列表中搜索名称“Anton”并将其替换为“Anthony”:SELECT REPLACE(ProductName, 'Anton', 'Anthony')FROM Products

posted @ 2011-12-09 10:08  Kencery  阅读(932)  评论(0编辑  收藏  举报
友情链接:初心商城