热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

存储过程_SQLServer存储过程具体解释

篇首语:本文由编程笔记#小编为大家整理,主要介绍了SQLServer存储过程具体解释相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了SQL Server 存储过程具体解释相关的知识,希望对你有一定的参考价值。





SQL Server 存储过程具体解释






存储过程的优缺点



  ◆长处:
  运行速度更快。

存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快。
  存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。
  使用存储过程封装事务性能更佳。
  能有效的放注入,安全性更好。
  可维护性高。在一些业务规则发生变化时。有时仅仅需调整存储过程就可以。而不用修改和重编辑程序。
  更好的代码重用。
  ◆ 缺点:
  存储过程将给server带来额外的压力。


   存储过程多多时维护比較困难。
  移植性差。在升级到不同的数据库时比較困难。
  调试麻烦。SQL语言的处理功能简单。



  总之复杂的操作或须要事务操作的SQL建议使用存储过程,而參数多且操作简单SQL语句不建议使用存储过程


存储过程定义

  存储过程是一组 Transact-SQL 语句,它们仅仅需编译一次,以后就可以多次运行。由于 Transact-SQL 语句不须要又一次编译。所以运行存储过程能够提高性能。

 
  触发器是一种特殊的存储过程,不由用户直接调用。创建触发器时,将其定义为在对特定表或列进行特定类型的数据改动时激发。



存储过程的设计规则
  CREATE PROCEDURE 定义自身能够包含随意数量和类型的 SQL 语句,但下面语句除外。
  不能在存储过程的不论什么位置使用这些语句。
  CREATE AGGREGATE、 CREATE RULE、CREATE DEFAULT、 CREATE SCHEMA、CREATE 或 ALTER FUNCTION、CREATE 或 ALTER TRIGGER、CREATE 或 ALTER PROCEDURE、CREATE   或 ALTER VIEW、SET PARSEONLY、SET SHOWPLAN_ALL、SET SHOWPLAN_TEXT、 SET SHOWPLAN_XML、USE database_name
  
  其它数据库对象均可在存储过程中创建。

能够引用在同一存储过程中创建的对象。仅仅要引用时已经创建了该对象就可以。


  能够在存储过程内引用暂时表。
  假设在存储过程内创建本地暂时表,则暂时表仅为该存储过程而存在;退出该存储过程后,暂时表将消失。
  假设运行的存储过程将调用还有一个存储过程,则被调用的存储过程能够訪问由第一个存储过程创建的全部对象。包含暂时表在内。
  假设运行对远程 Microsoft SQL Server 2005 实例进行更改的远程存储过程。则不能回滚这些更改。远程存储过程不參与事务处理。
  存储过程中的參数的最大数目为 2100。


  存储过程中的局部变量的最大数目仅受可用内存的限制。
  依据可用内存的不同,存储过程最大可达 128 MB
实现存储过程


技术分享CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;
number 
] 
技术分享             
[ { @parameter [ type_schema_name. ] data_type
[ VARYING ] [ =
default 
] [ [ OUT [ PUT ] ] --名称、类型、默认值、方向
技术分享
             [ ,...n ] 
技术分享         
[ WITH [ ,...n ]
技术分享         
[ FOR REPLICATION ] 
技术分享         
AS 
技术分享           { 
<sql_statement> [;][ ...n ] | <method_specifier> } --SQL语句
技术分享
         [;]
技术分享         
<procedure_option> ::= 
技术分享             
[ ENCRYPTION ]
技术分享             
[ RECOMPILE ] --执行时编译
技术分享
             [ EXECUTE_AS_Clause ]
技术分享         
<sql_statement> ::= { [ BEGIN ] statements [ END ] }
技术分享         
<method_specifier> ::= EXTERNAL
NAME assembly_name.class_name.method_name

运行存储过程

  使用 Transact-SQL EXECUTE 语句。假设存储过程是批处理中的第一条语句,那么不使用 EXECUTE keyword也能够运行存储过程
  使用 sp_procoption 让SQLSERVER 自己主动运行存储过程 
           sp_procoption [ @ProcName = ] ‘procedure‘ , [ @OptiOnName= ] ‘option‘    , [ @OptiOnValue= ] ‘value‘ --过程的名称、option 的唯一值为 startup、设置为开启(true 或 on)还是关闭(false 或 off)。


用TSQL语句编写存储过程
一、变量和參数
           DECLARE 语句通过下面操作初始化 Transact-SQL 变量:
           指定名称。名称的第一个字符必须为一个 @。
           指定系统提供的或用户定义的数据类型和长度。对于数值变量还指定精度和小数位数。对于 XML 类型的变量。能够指定一个可选的架构集合。
           将值设置为 NULL。


           如:DECLARE @MyCounter int
           第一次声明变量时,其值设置为 NULL。若要为变量赋值,请使用 SET 语句。这是为变量赋值的首选方法。也能够通过 SELECT 语句的选择列表中当前所引用值为变量赋值。
           參数用于在存储过程和函数以及调用存储过程或函数的应用程序或工具之间交换数据: 
           输入參数同意调用方将数据值传递到存储过程或函数。
           输出參数同意存储过程将数据值或游标变量传递回调用方。用户定义函数不能指定输出參数。
           每一个存储过程向调用方返回一个整数返回代码。

假设存储过程没有显式设置返回代码的值。则返回代码为 0。


二、流程控制语句

           1、BEGIN 和 END 语句
               BEGIN 和 END 语句用于将多个 Transact-SQL 语句组合为一个逻辑块。在控制流语句必须运行包括两条或多条 Transact-SQL 语句的语句块的不论什么地方。都能够使用 BEGIN 和 END 语句。
如:
IF (@@ERROR <> 0)
BEGIN
      SET @ErrorSaveVariable = @@ERROR
      PRINT ‘Error encountered, ‘ + 
     CAST(@ErrorSaveVariable AS VARCHAR(10))
END
           2、GOTO 语句
               GOTO 语句使 Transact-SQL 批处理的运行跳至标签。不运行 GOTO 语句和标签之间的语句。
       IF(1=1)
    GOTO calculate_salary
    print ‘go on‘ --条件成立则跳过此句。


       calculate_salary:
     print ‘go to‘
           3、IF...ELSE 语句
               IF 语句用于条件的測试。

得到的控制流取决于是否指定了可选的 ELSE 语句:
    if(1=1)
     print 1
    else if(2=2)
     print 2
    else if(3=3)
     print 3
    else
     print 0
           4、RETURN 语句
                 RETURN 语句无条件终止查询、存储过程或批处理。

存储过程或批处理中 RETURN 语句后面的语句都不运行。当在存储过程中使用 RETURN 语句时。此语句能够指定返回给调用应用程序、批处理或过程的整数值。假设 RETURN 未指定值。则存储过程返回 0
           5、WAITFOR 语句
                 WAITFOR 语句挂起批处理、存储过程或事务的运行,直到发生下面情况: 
     已超过指定的时间间隔。
     到达一天中指定的时间。


     指定的 RECEIVE 语句至少改动一行或并将其返回到 Service Broker 队列。
                 WAITFOR 语句由下列子句之中的一个指定:
             DELAY keyword后为 time_to_pass,是指完毕 WAITFOR 语句之前等待的时间。完毕 WAITFOR 语句之前等待的时间最多为 24 小时。 
     如:
      WAITFOR DELAY ‘00:00:02‘
      SELECT EmployeeID FROM    Employee;
             TIME keyword后为 time_to_execute,指定 WAITFOR 语句完毕所用的时间。
      GO
      BEGIN
          WAITFOR TIME ‘22:00‘;
          DBCC CHECKALLOC;
      END;
      GO
             RECEIVE 语句子句,从 Service Broker 队列检索一条或多条消息。使用 RECEIVE 语句指定 WAITFOR 时。假设当前未显示不论什么消息。该语句将等待消息到达队列。


             TIMEOUT keyword后为 timeout,指定 Service Broker 等待消息到达队列的时间长度(毫秒)。

能够在 RECEIVE 语句或 GET CONVERSATION GROUP 语句中指定 TIMEOUT。


           6、WHILE...BREAK 或 CONTINUE 语句
                 仅仅要指定的条件为 True 时,WHILE 语句就会反复语句或语句块。REAK 或 CONTINUE语句通常和WHILE一起使用。BREAK 语句退出最内层的 WHILE 循环,CONTINUE 语句则又一次開始 WHILE 循环。


技术分享  go 
技术分享  
declare @Num int
技术分享  
declare @ID int
技术分享  
declare @i int
技术分享  
set @i=1
技术分享  
while(exists(select * from T where Num<5   
)) 
--获取数量小于5的记录
技术分享
  begin
技术分享   
select @Num=Num,@ID=ID from T where Num<5 order by ID desc
技术分享   
print Str(@i)+ 编号:+Str(@ID)+  值+str(@Num)
技术分享   
update T set Num=Num*2 where ID=@ID
技术分享   
set @i=@i+1
技术分享   
if(@i>3)
技术分享     
break --退出循环
技术分享
   
技术分享  
end

           7、CASE 语句
            CASE 函数用于计算多个条件并为每一个条件返回单个值。CASE 函数通常的用途是将代码或缩写替换为可读性更强的值



技术分享--使用方法一:
技术分享
  select ID,
技术分享    Grade
=Case Num  
技术分享  
when  1 then 不及格  
技术分享  
when  2 then 不及格 
技术分享  
when  3 then 不及格
技术分享  
when  4 then 良好
技术分享  
else 优秀
技术分享  
end  
技术分享  
from T
技术分享  
---使用方法二:
技术分享
  select ID,
技术分享    Grade
=Case   
技术分享  
when    Num<3 then 不及格  
技术分享  
when    Num=3 then 及格 
技术分享  
when    Num=4 then 良好
技术分享  
when    Num>4 then 优秀
技术分享  
end  
技术分享  
from T
技术分享

三、执行时生成语句


           Transact-SQL 支持使用下列两种方法于执行时在 TTransact-SQL 脚本、存储过程和触发器中生成 SQL 语句:
使用 sp_executesql 系统存储过程运行 Unicode 字符串。sp_executesql 支持与 RAISERROR 语句类似的參数替换。
           使用 EXECUTE 语句运行字符串。EXECUTE 语句不支持已运行字符串中的參数替换。


四、处理数据库引擎错误 
          在 Transact-SQL 中有两种方式能够获取错误信息:
          1、在 TRY...CATCH 构造的 CATCH 块的作用域内。您能够使用下面系统函数:
            ERROR_LINE(),返回出现错误的行号。
            ERROR_MESSAGE(),返回将返回给应用程序的消息文本。该文本包含为全部可替换參数提供的值,如长度、对象名或时间。


            ERROR_NUMBER() 返回错误号。
            ERROR_PROCEDURE()。返回出现错误的存储过程或触发器的名称。假设在存储过程或触发器中未出现错误,该函数返回 NULL。
            ERROR_SEVERITY() 返回严重性。
            ERROR_STATE()。返回状态。
           2、在运行不论什么 Transact-SQL 语句之后,您能够马上使用 @@ERROR 函数測试错误并检索错误号。
           RAISERROR
             RAISERROR 用于将与 SQL Server Database Engine 生成的系统错误或警告消息使用同样格式的消息返回到应用程序中。
           3、PRINT 
             PRINT 语句用于将消息返回到应用程序。

PRINT 採用字符或 Unicode 字符串表达式作为參数,并将字符串作为消息返回到应用程序。

















































































































































































推荐阅读
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文讨论了B360主板是否可以安装win7系统的问题。由于B360主板不支持win7系统且缺乏官方驱动的支持,安装win7系统可能存在兼容性和稳定性问题。然而,通过借助USB3.0转接卡,B360主板仍然可以安装win7系统,但USB接口无法使用。相比之下,B365主板可以直接支持win7系统,并提供了相应的驱动,具有更好的稳定性和兼容性。选择合适的主板对于安装win7系统至关重要。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
命注定啊_894
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有