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 <procedure_option> [ ,...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 字符串表达式作为參数,并将字符串作为消息返回到应用程序。

SQL Server 存储过程具体解释的更多相关文章

  1. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  2. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  3. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  4. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  5. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  6. SQL Server错误代码及解释(留着备用)

    原文:SQL Server错误代码及解释(留着备用) 转自:http://www.ajia.me/Article/193.html Code Error Message 0 操作成功完成.  1 功能 ...

  7. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  8. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

  9. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

随机推荐

  1. VMware Workstation 14 UEFI启动

    1.新建虚拟机 完成后不要启动 修改虚拟机目录下的XXX.vmx文件 添加一行:firmware="efi" 然后启动UEFI安装系统.

  2. MySQL autocommit 和 start transaction

    autocommit 和 start transaction 都是事务相关的命令.类似MyISAM的mysql引擎就不支持. autocommit 默认是ON状态,即sql语句是自动提交的 show ...

  3. java多线程之ForkJoinPool

    转https://www.cnblogs.com/lixuwu/p/7979480.html 阅读目录 使用 背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任 ...

  4. 牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间

    [题解] 我想到了两种解法. 一种是扫描线+线段树+单调栈. 另一种方法是O(n)的,比较巧妙. 考虑每个数在哪些区间可以作为最小数.最长的区间就是它向左右走,直到有数字比它小,这个可以用单调栈维护. ...

  5. Uva 12325 Zombie's Treasure Chest (贪心,分类讨论)

    题意: 你有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1:宝物2的体积为S2,价值为V2.输入均为32位带符号的整数.你的任务是最多能装多少价值的宝物? 分析: 分类枚举, ...

  6. python 数据库操作产生中文乱码的解决办法

    1.执行python mysql数据库查询操作时,产生中文乱码 #!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb db = MySQLd ...

  7. Fidder详解-抓取HTTPS清求(Web/App)抓包分析(靠谱篇)

    为什么要学Fidder抓包? 学习接口,必须要学http协议,不要求您对协议的掌握有多深.只是希望你能够了解什么是协议.协议的报文.状态码等等!本文通过抓包工具Fidder带你进入接口的大门.我们通过 ...

  8. 安装mysql后无法找到临时密码的解决方案

    安装mysql后无法找到临时密码的解决方案 一.环境 系统:CentOS7mysql:5.7.20 二.解决步骤 step1:修改/etc/my.cnf添加: skip-grant-tables   ...

  9. [luoguP2622] 关灯问题II(状压最短路)

    传送门 本以为是状压DP,但是有后效性. 所以写一手状压spfa #include <queue> #include <cstdio> #include <cstring ...

  10. PHP复制和移动目录

    <?php //重命名一个文件或目录 rename("phpmyadmin", "phpadmin");//重命名成phpadmin /* * $dirs ...