仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1592|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之SQL SERVER数据库开辟之存储历程使用

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于update操作,只需要把event中的旧行和新行值对调即可。server|存储历程|数据|数据库大概有很多伴侣利用SQLSERVER做开辟也已有段日子,但还没有大概很少在项目中利用存储历程,也许有些伴侣以为基本没有需要利用存储历程等等。实在当你一个项目做完到了保护阶段时,就会发明存储历程给我们带来了优点了,修正便利,不克不及往改我们的使用程序,只必要改存储历程的内容,并且还可使我们的程序速率失掉进步。
援用:
SQLSERVER联机丛书中的界说:
  存储历程是保留起来的能够承受和前往用户供应的参数的Transact-SQL语句的汇合。
  能够创立一个历程供永世利用,或在一个会话中一时利用(部分一时历程),或在一切会话中一时利用(全局一时历程)。
  也能够创立在MicrosoftSQLServer启动时主动运转的存储历程。


  要利用存储历程,起首我们必须熟习一些基础的T-SQL语句,由于存储历程是因为一组T-SQL语句组成的,而且,我们必要懂得一些关于函数、历程的观点,由于我们必要在使用程序中挪用存储历程,就像我们挪用使用程序的函数一样,不外挪用的办法有些分歧。
  上面我们来看一下存储历程的创建和利用办法。
1、创立存储历程
  和数据表一样,在利用之前我们必要创立存储历程,它的简明语法是:
援用:
CREATEPROC存储历程称号
[参数列表(多个以“,”分开)]
AS
SQL语句


例:
援用:
CREATEPROCupGetUserName
@intUserIdINT,
@ostrUserNameNVARCHAR(20)OUTPUT--要输入的参数
AS
BEGIN
--将uName的值赋给@ostrUserName变量,即要输入的参数
SELECT@ostrUserName=uNameFROMuUserWHEREuId=@intUserId
END


  个中CREATEPROC语句(完全语句为CREATEPROCEDURE)的意义就是告知SQLSERVER,如今必要创建一个存储历程,upGetUserName就是存储历程称号,@intUserId和@ostrUserName分离是该存储历程的两个参数,注重,在SQLSERVER中,一切用户界说的变量都以“@”开首,OUTPUT关头字暗示这个参数是用来输入的,AS以后就是存储历程内容了。只需将以上代码在“查询剖析器”里实行一次,SQLSERVER就会在以后数据库中创立一个名为“upGetUserName”的存储历程。你能够翻开“企业办理器”,选择以后操纵的数据库,然后在右边的树型列表当选择“存储历程”,此时就能够在右侧的列表中看到你方才创立的存储历程了(假如没有,革新一下便可)。
2、存储历程的挪用
  之前我们已创立了一个名为“upGetUserName”的存储历程,从字面了解该存储历程的功效是用来获得某一个用户的称号。存储历程创建好了,接上去就是要在使用程序里挪用了,上面看一下在ASP程序里的挪用。
援用:
DimadoComm
//创立一个工具,我们用来挪用存储历程
SetadoComm=CreateObject("ADODB.Command")
WithadoComm
//设置毗连,设adoConn为已毗连的ADODB.Connection工具
.ActiveConnection=adoConn
//范例为存储历程,adCmdStoredProc=4
.CommandType=4
//存储历程称号
.CommandText="upGetUserName"
//设置用户编号
.Parameters.Item("@intUserId").Value=1
//实行存储历程
.Execute
//获得从存储历程前往的用户称号
Response.Write"用户名:"&.Parameters.Item("@ostrUserName").Value
EndWith
//开释工具
SetadoComm=Nothing


  经由过程以上两步,我们已能够创立和利用复杂的存储历程了。上面我们来看一个略微庞大点的存储历程,以进一步懂得存储历程的使用。
3、存储历程的实践使用
  用户登录在ASP项目中常常会利用到,信任良多伴侣也都做过相似的体系,但利用存储历程来做考证伴侣大概未几,那末我们就以它来做例子,写一个复杂的用户登录考证的存储历程。
援用:
CREATEPROCupUserLogin
@strLoginNameNVARCHAR(20),
@strLoginPwdNVARCHAR(20),
@blnReturnBITOUTPUT
AS
--界说一个一时用来保留暗码的变量
DECLARE@strPwdNVARCHAR(20)
BEGIN
--从表中查询以后用户的暗码,赋值给@strPwd变量,上面要对他举行对照
SELECT@strPwd=uLoginPwdFROMuUserWHEREuLoginName=@strLoginName
IF@strLoginPwd=@strPwd
BEGIN
SET@blnReturn=1
--更新用户最初登录工夫
UPDATEuUserSETuLastLogin=GETDATE()WHEREuLoginName=@strLoginName
END
ELSE
SET@blnReturn=0
END


  用户登录的存储历程创建好了,如今在程序里试一下吧。注重,在一个地区内假如有多条语句时,必须利用BEGIN...END关头字。
援用:
DimadoComm
//创立一个工具,我们用来挪用存储历程
SetadoComm=CreateObject("ADODB.Command")
WithadoComm
//设置毗连,设adoConn为已毗连的ADODB.Connection工具
.ActiveConnection=adoConn
//范例为存储历程,adCmdStoredProc=4
.CommandType=4
//存储历程称号
.CommandText="upUserLogin"
//设置登录称号
.Parameters.Item("@strLoginName").Value="admin"
//设置登录暗码
.Parameters.Item("@strLoginPwd").Value="123456"
//实行存储历程
.Execute
//判别是不是登录乐成
If.Parameters.Item("@blnReturn").Value=1Then
Response.Write"祝贺你,登录乐成!"
Else
Response.Write"不是吧,仿佛错了哦。。。"
EndIf
EndWith
//开释工具
SetadoComm=Nothing


  经由过程以上的步骤,复杂用户登录考证历程也做完了,如今只需把它整合到程序中就能够完成复杂的用户登录考证了,关于其他细节就由你本人来处置了。
  下面先容的两个存储历程都是只前往一个值的,上面我们来看一个前往一个纪录集的存储历程。
援用:
CREATEPROCupGetUserInfos
@intUserGroupINT
AS
BEGIN
--从数据库中抽取切合前提的数据
SELECTuName,uGroup,uLastLoginFROMuUserWHEREuGroup=@intUserGroup
--拔出一列算计
UNION
SELECT算计人数:,COUNT(uGroup),NULLFROMuUserWHEREuGroup=@intUserGroup
END


  如今我们来看一下ASP程序的挪用。
援用:
DimadoComm
DimadoRt
//创立一个工具,我们用来挪用存储历程
SetadoComm=CreateObject("ADODB.Command")
SetadoRs=CreateObject("ADODB.Recordset")
WithadoComm
//设置毗连,设adoConn为已毗连的ADODB.Connection工具
.ActiveConnection=adoConn
//范例为存储历程,adCmdStoredProc=4
.CommandType=4
//存储历程称号
.CommandText="upGetUserInfos"
//设置用户组
.Parameters.Item("@intUserGroup").Value=1
//实行存储历程,和以上几个例子分歧,这里利用RecordSet的Open办法
adoRs.OpenadoComm
//显现第一个值
Response.writeadoRs.Fields(0).Value
EndWith
//开释工具
SetadoRs=Nothing
SetadoComm=Nothing


  怎样,是否是也很复杂呢,不外存储历程的用途不单单只要这些,他另有更壮大的功效,好比利用游标、一时表来从多个表,乃至是多个数据库中挪用数据,然后前往给用户,这些你能够在利用过程当中渐渐的往开掘。
  好了,存储历程使用就先先容到这里,假如你对本文有任何疑问,接待跟贴提出,我将全力赐与解答。下次我将给人人先容触发器的使用。

使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-19 09:52:16 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
爱飞 该用户已被删除
板凳
发表于 2015-1-26 12:32:52 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
admin 该用户已被删除
地板
发表于 2015-2-4 15:37:27 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
飘灵儿 该用户已被删除
5#
发表于 2015-2-10 03:14:12 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
老尸 该用户已被删除
6#
发表于 2015-2-28 18:01:23 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
柔情似水 该用户已被删除
7#
 楼主| 发表于 2015-3-10 04:25:18 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
透明 该用户已被删除
8#
发表于 2015-3-17 05:08:58 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
因胸联盟 该用户已被删除
9#
发表于 2015-3-17 05:08:58 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
小妖女 该用户已被删除
10#
发表于 2015-3-23 21:26:20 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表