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,一经查实,立即删除!

相关文章

isinfinite_Java Double类isInfinite()方法与示例

isinfinite双类isInfinite()方法 (Double class isInfinite() method) isInfinite() method is available in java.lang package. isInfinite()方法在java.lang包中可用。 isInfinite() method is used to check infinity (i.e. either positive infinity or negative infinity…

MySql学习(一)

SQL语句的分类:DDL(数据定义语言)、DML(数据操作语言)、DCL(数据控制语句)MySql的命令语句以;或\g结束建库:Create database name;建表:Create tablle name;选…

C盘爆红的解决办法

方法一:开始—>搜索—>cleanmgr—>磁盘清理—>选择你所需要清理的磁盘即可 方法二:我的电脑右击—>管理—>磁盘管理—>右键选择你要压缩的磁盘—>压缩卷—>输入压缩空间量—>压缩—>右键 拓展卷—>下一步—>输入…

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

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

Oracle 参数分类 和 参数的查看方法

Oracle数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动&#xff0c;每个实例在启动之前&#xff0c;首先读取这些参数文件中设置的不同参数。 Oracle系统中的参数&#xff0c;根据系统使用情况可以简单分为两大类&#xff1a; 普通参数&#xff1a;也就是Or…

java 方法 示例_Java集合checkedList()方法与示例

java 方法 示例集合类checkedList()方法 (Collections Class checkedList() method) checkedList() Method is available in java.lang package. CheckedList()方法在java.lang包中可用。 checkedList() Method is used to return the typesafe view of the given List at runt…

ParameterizedTypeImpl

关于“通过反射获得泛型的参数化类型”的问题&#xff1a; 下面是张老师 通过反射获得泛型的参数化类型的一段代码import java.util.*; import java.lang.reflect.*;public class GenericalReflection { private Vector<Date> dates new Vector<Date>(); public v…

Spyder打开报错解决办法

删除C:\Users\Administrator路径下.matplotlib和.spyder-py3&#xff08;你的有可能是.spyder2或.spyder3&#xff09;这两个文件夹&#xff0c;然后再重启Spyder即可 &#xff08;本人也是查找多篇大佬博客然后最后找到的解决方法&#xff09;

ERP软件销售的方法论--SPIN销售法(SPIN Selling)

有许多人一直在做的ERP软件产品的销售&#xff0c;也接受了许多关于销售方法的培训&#xff0c;我所了解的就包括有C139&#xff0c;用友的《策略九问》等方法&#xff0c;但其实行业内早就有先驱创立了相关的销售方法&#xff0c;那就是SPIN销售法&#xff0c;之前一直都是只知…

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…

Java类class isSynthetic()方法及示例

类的类isSynthetic()方法 (Class class isSynthetic() method) isSynthetic() method is available in java.lang package. isSynthetic()方法在java.lang包中可用。 isSynthetic() method is used to check whether this Class is a synthetic class or not. isSynthetic()方法…

BNU OJ 第26303 题 Touchscreen Keyboard

BNU OJ第26303题Touchscreen Keyboard&#xff08;题目链接&#xff09;的解题报告。 原题如下&#xff1a; Touchscreen Keyboard Problem Description Nowadays, people do not use hardware keyboards but touchscreens. Usually, they touch on the wrong letters with the…

列表(二)

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…

stl中map函数_map :: empty()函数以及C ++ STL中的Example

stl中map函数C STL映射:: empty() (C STL map::empty()) It is built-in function in C STL and used to check whether the map container is empty or not i.e whether its size is 0 or not? 它是C STL中的内置函数&#xff0c;用于检查地图容器是否为空&#xff0c;即其…

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)…