SQl Server存储过程基础

 

一、存储过程的概念

    存储过程是SQL语句和可选控制流语句的预编译集合,存储在数据库中,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。

在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。

         使用存储过程有几下几个优点:

         1.可以在单个存储过程中执行一系列SQL语句。

         2.可以从自己的存储过程内引用其他存储过程,这可以简化一系列复杂语句。

       3.存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快,而且减少网络通信的负担。

         4.安全性更高,使用参数,天然的避免Sql注入。

二、创建存储过程

    我们在使用Sql语句来创建存储过程前,应该考虑下列几个事项:

      1、不能将 CREATE PROCEDURE 语句与其它 SQL 语句组合到单个批处理中。

      2、存储过程可以嵌套使用,嵌套的最大深度不能超过32层。

      3、创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。

      4、存储过程是数据库对象,其名称必须遵守标识符规则。

      5、只能在当前数据库中创建存储过程。

      6、一个存储过程的最大尺寸为128M。

    创建存储过程的语法如下:

ContractedBlock.gifExpandedBlockStart.gif代码
      CREATE PROCEDURE 存储过程名

  (

参数1 参数类型
=参数值 参数方向

参数2 参数类型
=参数值 参数方向

       )

      AS

  Begin

存储过程体

RETURN

   End

 

    下面我们使用示例来展示如何创建一个存储过程:        

ContractedBlock.gifExpandedBlockStart.gif代码
USE Northwind
GO
 /*存储过程被创建之后,它的名字就存储在系统表sysobjects中,
它的源代码存放在系统表syscomments中,所以在创建存储过程之前,
先判断一下系统中是否已经创建过该存储过程了,如果创建过了,那么先删除该存储过程。*/
 If Exists(select * from sysobjects where name=’ myProcedure’ and type=’p’)
  Drop procedure myProcedure;
GO
 
Create Proc myProcedure
( @SupplierID_2 int,
@CategoryID_3 int,
@ProductName_1 nvarchar(40)='', --该参数默认值为’无’
@ProductName_2 nvarchar(40) output)
AS
  Begin
      Insert into Products   (ProductName,SupplierID,CategoryID)
               values   (@ProductName_1,@SupplierID_2,@CategoryID_3);
select @ProductName_2 = ProductName from products
                   where SupplierID = @SupplierID_1 ;
  end
GO

 

  注意: 1. 语句体中,使用SET来给参数赋值。

             2. 存储过程的所有变量的参数都需要用“@”作为开始符;

             3. 在存储过程中能声明变量,能进行循环操作,如下:

ContractedBlock.gifExpandedBlockStart.gif代码
Create procedure BatchAddClass

As

Begin

Declare @count
int

Set @count
=10

While @count
>0

Begin

Insert into tbClass(ClassName) Values(@count)

Set @count
=@count-1

End

Return

End

   上述语句实现了批量插入10条记录到tbClass表中;

 

三、执行存储过程

  直接执行存储过程可以使用EXECUTE命令来执行,下面使用示例来执行存储过程:

 

declare @product nvarchar(40)

exec myProcedure
1, 1001, @product output

select
'产品名'= @product

go

 

  使用系统存储过程来查看用户创建的存储过程,可供使用的系统存储过程及其语法形式如下:

    sp_help:用于显示存储过程的参数及其数据类型

               sp_help [name]

      参数name为要查看的存储过程的名称。

       sp_helptext:用于显示存储过程的源代码

                 sp_helptext [name]

      参数name为要查看的存储过程的名称。

       sp_depends:用于显示和存储过程相关的数据库对象

                 sp_depends [name]

      参数name为要查看依赖关系的存储过程的名称。

       sp_stored_procedures:用于返回当前数据库中的存储过程列表

 

四、修改存储过程

  存储过程可以根据用户的要求或者基表定义的改变而改变。使用ALTER PROCEDURE语句可以更改先前通过执行 CREATE PROCEDURE 语句创建的过程,但不会更改权限,也不影响相关的存储过程或触发器。修改存储过程的方法和创建存储过程的方法一样,只是将创建存储过程的Create  Procedure改为Alter Procedure而已。

 

五、重命名和删除存储过程

  1. 重命名存储过程

                修改存储过程的名称可以使用系统存储过程sp_rename,其语法形式如下:

                      sp_rename  原存储过程名称,新存储过程名称

             另外,通过企业管理器也可以修改存储过程的名称。

 

  2.删除存储过程

      删除存储过程可以使用DROP命令,DROP命令可以将一个或者多个存储过程或者存储过程组从当前数据库中删除,其语法形式如下:

             drop    procedure {procedure} [,…n]

      当然,利用企业管理器也可以很方便地删除存储过程。

 

六、存储过程的重新编译

   在我们使用了一次存储过程后,可能会因为某些原因,必须向表中新增加数据列或者为表新添加索引,从而改变了数据库的逻辑结构。这时,需要对存储过程进行重新编译,SQL Server提供三种重新编译存储过程的方法 :

    1、在建立存储过程时设定重新编译

       语法格式:

CREATE PROCEDURE procedure_name

WITH RECOMPILE AS sql_statement

     2、在执行存储过程时设定重编译

       语法格式:

EXECUTE procedure_name WITH RECOMPILE

 

    3、通过使用系统存储过程设定重编译

        语法格式

EXEC sp_recompile OBJECT

 

七、系统存储过程与扩展存储过程

  1.系统存储过程

    系统存储过程存储在master数据库中,并以sp_为前缀,主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助,为用户查看数据库对象提供方便。比如用来查看数  据库对象信息的系统存储过程sp_help、显示存储过程和其它对象的文本的存储过程sp_helptext等。

 

  2.扩展存储过程:

    扩展存储过程以xp_为前缀,它是关系数据库引擎的开放式数据服务层的一部分,其可以使用户在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了Transact-SQL的功能,并且可以象调用Transact-SQL过程那样从Transact-SQL语句调用这些函数。

例:  利用扩展存储过程xp_cmdshell为一个操作系统外壳执行指定命令串,并作为文本返回任何输出。

use master

exec xp_cmdshell
'dir *.exe'

 

    执行结果返回系统目录下的文件内容文本信息。

转载于:https://www.cnblogs.com/RascallySnake/archive/2010/05/12/1733813.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈应用_检测成对符号是否正确使用(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h> #include <stdlib.h> #include "LinkStack.h"//该程序是检查字符串中的出…

ffmpeg - AVPacket内存问题分析(AVFrame一样的)

目录&#xff1a;1、av_packet_alloc()和av_packet_free()2、av_init_packet()的问题3、av_packet_move_ref()的问题4、av_packet_clone()的问题5、AVPacket的引用计数问题6、 AVFrame一样的1、av_packet_alloc()和av_packet_free() 源码中av_packet_unref()调用av_buffer_unre…

列表(二)

1&#xff0c;什么是列表&#xff1f; 列表由一系列按特定顺序排列的元素组成。得知列表内的元素是有序的。 在Python中&#xff0c;用方括号&#xff08;[]&#xff09;来表示列表&#xff0c;并用逗号来分隔其中的元素。 color [red,blue,black,yellow]#定义一个字符串列表…

Zigbee在.Net Micro Framework系统中的应用

Zigbee是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞&#xff0c;由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息&#xff0c;也就是说蜜蜂依靠这样的方式构成…

ffmpeg-AVFrame分配内存问题

目录&#xff1a;1、格式&#xff1a;交错式2、格式&#xff1a;平坦式3、总结&#xff1a;1、格式&#xff1a;交错式 LRLRRLRLRLRLRLRLRLR 2、格式&#xff1a;平坦式 LLLLLLRRRRRR 3、总结&#xff1a; 两种方式的内存排列在AVFrame中分配是有区别的 交错式在一个buf…

C#使用Dotfuscator混淆代码以及加密

C#编写的代码如果不进行一定程度的混淆和加密&#xff0c;那么是非常容易被反编译进行破解的&#xff0c;特别是对于一些商业用途的C#软件来说&#xff0c;因为盯着的人多&#xff0c;更是极易被攻破。使用Dotfuscator可以实现混淆代码、变量名修改、字符串加密等功能。 这里介…

操作列表(三)

1&#xff0c;for循环(for 变量名 in 列表名:) phone [iphone 8, xiaomi10pro, huaweiv30pro, honor20, jianguopro]#定义一个列表phone for tel in phone:print("手机的类型为&#xff1a;" tel.title())#当然这里的每个元素也可以调用title()等一些方法 print(&…

C#特性之通俗演义

首先要说的是&#xff0c;可能一些刚接触C#的朋友常常容易把属性&#xff08;Property&#xff09;跟特性&#xff08;Attribute&#xff09;弄混淆&#xff0c;其实这是两种不同的东西。属性就是面向对象思想里所说的封装在类里面的数据字段&#xff0c;其形式为&#xff1a; …

栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h> #include "LinkStack.h"//该程序用栈来计算算式 /*比如&#xff1a;1*56/(5-3)…

栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h> #include "LinkStack.h"/* 该程序将 正常的算式 转换成按照运算符优先分布的算式…

课堂笔记(一)

1&#xff0c;怎样查询函数的用法 help(函数名) 2&#xff0c;表达式float(0b1100010101)float(0o1425)float(0x315)的结果是什么&#xff0c;并说明原因 True 浮点类型的数用二进制八进制十六进制的不同表达 3&#xff0c;oct()方法 转换八进制输出 4&#xff0c;hex()方…

[转]深入浅出Java设计模式之备忘录模式

本文转自&#xff1a;http://dev.yesky.com/450/2070450.shtml 一、引子   俗话说&#xff1a;世上难买后悔药。所以凡事讲究个“三思而后行”&#xff0c;但总常见有人做“痛心疾首”状&#xff1a;当初我要是……。如果真的有《大话西游》中能时光倒流的“月光宝盒”&#…

递归问题(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>//该程序使用递归将字符串从后往前依次输出void reverse(char* s) {if( (s ! NULL) && (*s ! \0) ){reverse(s 1);printf("%c", *s);…

递归-裴波那契数列(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>//该程序输出裴波那契数列 int fibonacci(int n) {if( n > 1 ){return fibonacci(n-1) fibonacci(n-2);//注意&#xff1a;这里调用是一直调用左边函…

经典例题(一)

1&#xff0c;已知复数 x 6 8j 请写出它的模、实部、虚部及共轭复数的命令&#xff0c;并写出运行结果。 X 6 8j print("模为:%d"% abs(X)) print("实部为:%s"% X.real) print("虚部为:%s"% X.imag) print("共轭复数为:%s"% X.co…

递归-汉诺塔(代码、分析、汇编)

代码&#xff1a; #include <stdio.h>void hanoi(int n, char a, char b, char c) {if( n > 0 ){if( n 1 ){printf("%c -> %c\n", a, c);}else{hanoi(n-1, a, c, b);printf("%c -> %c\n", a, c);hanoi(n-1, b, a, c);}} }int main() {han…

if语句(四)

1&#xff0c;简单if示例 phones [iphone,xiaomi,huawei,smartisan] for phone in phones:if phone huawei:print(phone.upper())#将字符串的所有字母大写else:print(phone.title())#将字符串中的每个单词的首字符大写效果图如下&#xff1a; 2&#xff0c;if条件测试 ph…

welcome to my blog

转载于:https://www.cnblogs.com/jiangjun/archive/2012/10/22/2734600.html

递归-输出字符串所有的组合情况(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; #include <stdio.h>/*程序描述&#xff1a;输出字符串所有的组合情况使用permutation函数进行将指定的下标值&#xff0c;与最大下标值这个范围的每个下标值进行交换每调用一次permu…

递归-计算字符串长度(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>//该程序用递归计算字符串长度int strlen(const char* s) {if( s NULL ){return -1;}else if( *s \0 ){return 0;}else{return strlen(s1) 1;} }int m…