首页 - 数据库 - SQL Server

使用SQL存储过程要特别注意的问题

发布时间: 2007-04-19 05:04    作者: 未知    来源: 未知    浏览:    评论

    存储过程是一个运行于SQL数据库之中最核心的事务,它通过长驻内存的形式,进行读取\处理\写入最为频繁处理的数据.
    ASP虽然在微软的ASPX的侵袭下,仍旧是中小企业继续在用的一种网页语言,但是当要读取海量数据的时候,如果仍旧使用普通的SQL进行读取运行与写入,将导致系统资源的严重浪费,所以我们在ASP中使用存储过程,以提高数据的存取速度,同时通过SQL核心的获取数据的方法,可以有效的减少垃圾数据(不被立即使用,而且也不备较短的时间里被使用的数据)操作.
    在ASP中使用存储过程也是相当的容易,例如以下一个通过SQL存储过程进行分页的方法:
存储过程:
CREATE procedure p_splitpage   
@sql nvarchar(4000), --要执行的sql语句
@page int=1,    --要显示的页码
@pageSize int,  --每页的大小
@pageCount int=0 out, --总页数
@recordCount int=0 out --总记录数
as
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordCount = @pageCount
select @pagecount=ceiling(1.0*@pagecount/@pagesize)
 ,@page=(@page-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize 
exec sp_cursorclose @p1
GO
ASP页面的内容
sql = "Select id, c_s_name from tabNews where deleted<>1 Order By id Desc"
page = cint(page_get)
if page_post<>""then
 page = cint(page_post)
end if
if not page > 0 then 
 page = 1
end if
pagesize=20’每页的条数
set cmd = server.CreateObject("adodb.command")
cmd.ActiveConnection = conn
cmd.CommandType = 4
cmd.CommandText = "p_SplitPage"
cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql)
cmd.Parameters.Append cmd.CreateParameter("@page",4,1, 4, page)
cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, pageSize)
cmd.Parameters.Append cmd.CreateParameter("@pageCount",4,2, 4, pageCount)
cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, recordCount)
set rs = cmd.Execute
set rs = rs.NextRecordSet
pageCount = cmd.Parameters("@pageCount").value
recordCount = cmd.Parameters("@recordCount").value
if pageCount = 0 then pageCount = 1
if page>pageCount then 
 response.Redirect("?page="&pageCount) 
end if
set rs = cmd.Execute
    我们如此就可以实现对数据的读取并可以进行有效的分页,但是我们往往会发现一个问题,如果我们构造的SQL语句如果使用的是select * from tab ...的话,就经常出现无法读取数据的错误,或者是读取出来,但是有的数据无法显示的错误,经过仔细的检查发现,如果是排列在SQL语句的前列的数据可以被读取,而如果不按照SQL读取出来的字段进行顺序读取,就会出现数据丢失的情况,所以唯一的途径就是进行顺序读取.如:
    对于select id, newsTitle, newsContent from tabNews where ...的SQL语句,就应当将所有的数据读取到变量上来,并且要求是按照SQL语句的顺序进行读取,然后这些数据就可以自由的使用了.
    id = rs("id")
    newsTitle = rs("newsTitle")
    ...
    分析出现这个的原因是:SQL数据库在构造虚拟表的时候就是以一种先进先出的原则,把所有的数据排列在一个内存段之中,通过顺序的读取,将数据逐一的读取,而如果跳过某个具体的字段获取下一个字段的信息,系统就会将原来的那个字段的信息丢失,以释放内存,这是出于系统构造的简单性和系统的内存最低化的要求,所以这样也保证了有限的内存资源得到最充分的发挥,这也是为什么存储过程比普通的SQL要快的原因.
Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多