设为首页 收藏本站
查看: 1055|回复: 0

[经验分享] 【SQL Server】存储过程的设计与概念(2)从存储过程接收信息

[复制链接]

尚未签到

发表于 2016-11-7 09:17:27 | 显示全部楼层 |阅读模式
  从存储过程结束信息的途径有4种:
    1、结果集
    2、输出参数
    3、返回值
    4、全局游标
  返回结果集:
    为了从存储过程中获取结果集,需要在存储过程主体中插入返回结果集的T-SQL语句,最简单的方法就是使用SELECT语句,但也可以调用另一个存储过程。
    也可以从一个存储过程中返回多个结果集,这样的存储过程只不过是多包含几个SELECT语句,但要注意有些客户端的数据访问技术可以访问所有的结果集如ADO,ADO.NET,但是有的技术只能访问一个结果集。
  输入参数与输出参数:
    创建存储过程使可以包含一个由逗号(,)分割的参数列表,分为两种类型,分别为输入参数和输出参数。参数的默认类型为输入参数:

create proc getJobInfo
@job_id int
as
select * from jobs where job_id=@job_id
go
execute getJobInfo 1

  如下包含一个输出参数,注意output的使用,以及在调用存储过程时接收输出参数的方法:
 

create proc getJobDesc
@job_id int,
@job_desc varchar(2000) output
as
select @job_desc=job_desc from jobs where job_id=@job_id
go
declare @desc varchar(2000)
execute getJobDesc 1,@desc output
print @desc

  参数的默认值:
   如果存储过程语句具有参数,则必须在调用存储过程时提供这些参数的值,否则SQL SERVER 会报错。但也可以为这些参数设定默认值,这样用户就不一定非要提供这些参数了!

ALTER  proc getJobInfo
@job_id int=1
as
select * from jobs where job_id=@job_id
go
execute getJobInfo
execute getJobInfo 2

  按名称传参与按位置传参:
    按位置传参要求各个参数的顺序必须是一定的,而按名称传参则无此限制

create proc getJob
@min_lvl int,
@max_lvl int
as
begin
select * from jobs where min_lvl>@min_lvl and max_lvl<@max_lvl
end
--按名称传参
execute getJob @max_lvl=800,@min_lvl=10
---按位置传参
execute getJob 10,800 --相当于:execute getJob @min_lvl=10,@max_lvl=800

  返回值:
   每一个存储过程都可以以一个Return语句结尾,该语句的后面紧跟可以被调用者读取的integer值,或结果为整型值的表达式,如果没有显式的设置该值,怎返回默认值0。因为返回值局限于整形数据类型,他们最常用的场合就是向调用者发送状态和错误代码!
   注意以下调用返回值时的方法与OUTPUT的不同:
 

alter proc getJob
@job_id int,
@desc varchar(2000) output
as
begin
select @desc=job_desc from jobs where job_id=@job_id
return @@error
end
declare @id int,@desc varchar(2000),@result int
-------把存储过程直接赋值给用于接收返回值的变量
execute @result=getJob 1,@desc output
select @result,@desc

  开发人员在运行任何T-SQL语句批处理时,SQL SERVER都要执行以下3步:
       1、解析批处理
       2、编译批处理
       3、执行批处理开发人员在运行任何T-SQL语句批处理时,SQL SERVER都要执行以下3步:
       1、解析批处理
       2、编译批处理
       3、执行批处理
解析
  所谓“解析”是指SQL SERVER 命令解析模块首先检查批处理语法的过程。如果没有找到错误,命令解析器将源代码细分成多个逻辑单元,比如关键字、标识符以及运算符。接着解析器构建一个内部结构,然后使用这个内部结构描述执行请求操作或从源数据提取请求结果集所需的一系列步骤。如果该批处理包含一个查询,那么这个内部结构被称作一个查询树;如果该批处理包含一个过程,那么他被称为一棵顺序树。
  编译:
  在这一步中,顺序树被用来生成一个执行计划。优化器模块对可从源表检索信息的各种方法进行分析。它试图寻找一种利用最小资源的最快方法,同时还补充了执行时需要使用的任务列表(例如:检查安全,确认是否强制约束,如果在处理时需要合并的话,还要包含触发器,等等)。结果是一个被称为执行计划的内被结构。
  执行:
  执行计划存储在过程告诉缓存中,它可以在那里被执行。执行计划中的不同步骤将被发送到关系引擎中的不同模块进行执行;DML管理器、DDL管理器、存储过程管理器、事务处理管理器或实用工具管理器。处理结果将以结果集的形式被收集并发送给调用者。
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shaoboyy/archive/2008/11/12/3281634.aspx 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296847-1-1.html 上篇帖子: sql server 把从一个表查询到的记录插到另一个表 下篇帖子: 在.NET程序安装包中附带 SQL SERVER数据库安装功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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