热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MSSQL存储过程学习笔记一关于存储过程

在写笔记之前,首先需要整理好这些概念性的东西,否则的话,就会在概念上产生陌生或者是混淆的感觉。
一、 存储过程的概念,优点,语法
在写笔记之前,首先需要整理好这些概念性的东西,否则的话,就会在概念上产生陌生或者是混淆的感觉。
概念:将常用的或者是很复杂的工作,预先利用SQL语句写好并用一个指定的名称存储起来,那么以后要是调用这些SQL语句的时候,只需要利用Execute/Exec执行以下,即可。
优点:当然了,使用存储过程的优点是很多的,下面来一一说明。
1、 存储过程只是在创造的时候进行编译,以后每次执行的时候,就不需要编译了,但是直接利用SQL的话,需要每次运行的时候都重新编译一次,所以使用存储过程可以提高数据库的执行速度。
2、 当对数据库进行复杂操作的时候,利用存储过程进行封装,可以减少代码出错的几率,并且MSSQL本身具有代码调试能力,可以很容易的定位到出错的语句。
3、 存储过程可以重复使用,可以提高开发人员的开发效率。
4、 安全性高,可以设定只有特定权限的用户对存储过程进行操作;也可以在一定的程度上预防SQL注入操作。
种类:存储过程分为三类,分别为系统存储过程、扩展存储过程、用户自定义存储过程。
1、 系统存储过程:就是以SP_开头的存储过程,用来进行系统的各种设定,取得信息,进行相关的管理工作等等;如:sp_help就是取得指定对象的相关信息。
2、 扩展存储过程:就是以XP_开头的,用来调用操作系统提供的功能。以下为引用的内容:exec master..xp_cmdshell ‘ping 127.0.0.1'
3、 用户自定义的存储过程:
常用格式如下:
代码如下:

Create procedure procedue_name
  [@parameter data_type][output]
  [with]{recompile|encryption}
  as
  sql_statement

需要说明的就是:
output:表明此参数是可以回传的。
[with]{recompile|encryption}中的recompile:表明每次执行此存储过程的时候,都重新编译一次(默认情况下只有在创建的时候才进行编译)。
encryption:所创建的存储过程的内容会被加密。
小技巧:在这里需要说明的是,如果我们有时候要在数据库中查找所有包含A关键字的表的列的名称,那么该如何寻找呢?可以利用下面的语句:
代码如下:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNSwhere COLUMN_NAME like '%A%'; --查看那些表含有包含A的列

但是如果想在存储过程找存在表“B”的存储过程的名称,该如何做呢,可以利用下面的语句来进行:
代码如下:

select routine_name, routine_definition from information_schema.routines
where routine_definition like '%B%'
and routine_type='procedure'

当然了,我们其实还可以利用SQL中的syscomments,sysobjects,sysdepends来查看具体的数据信息,这个和oracle中的dba_objects等很像:
代码如下:

select * from syscomments; --查看标注
select * from sysobjects; --查看数据库对象
select * from sysdepends; --查看依赖关系

二、存储过程进阶
当然了,说先来说明下存储过程的格式语法规则:
代码如下:

Create Procedure Procedure-name ( Input parameters , Output Parameters (If required))AsBegin Sql statement used in the stored procedureEnd

在这里我们利用一个普通的例子来说明:
代码如下:

/* Getstudentname is the name of the stored procedure*/
Create PROCEDURE Getstudentname(
@studentid INT --Input parameter , Studentid of the student
)
AS
BEGIN
SELECT Firstname+' '+Lastname FROM tbl_Students WHERE studentid=@studentid
END

当然了,这里的@studentid参数只是一个传入的参数,但是如果想回传一个值,那么就需要利用到out参数来实现,具体的实现代码如下:
代码如下:

/*
GetstudentnameInOutputVariable is the name of the stored procedure which
uses output variable @Studentname to collect the student name returns by the
stored procedure
*/
Create PROCEDURE GetstudentnameInOutputVariable
(
@studentid INT, --Input parameter , Studentid of the student
@studentname VARCHAR(200) OUT -- Out parameter declared with the help of OUT keyword
)
AS
BEGIN
SELECT @studentname= Firstname+' '+Lastname FROM tbl_Students WHERE studentid=@studentid
END

从上面的代码,可以看出out参数的具体用法,但是如果想在SQL服务器端执行这段代码,那该如何进行呢?
其实,一说到这,稍微麻烦一点,如果是只有in参数,那么只需要利用execute/exec 后面加上存储过程的名称,里面给参数赋值即可;但是如果不仅有in参数,而且有out参数,这个该怎么来弄呢?
下面通过一个具体的实例来详细的描述用法:
代码如下:

Alter PROCEDURE GetstudentnameInOutputVariable
(
@studentid INT, --Input parameter , Studentid of the student
@studentname VARCHAR (200) OUT, -- Output parameter to collect the student name
@StudentEmail VARCHAR (200)OUT -- Output Parameter to collect the student email
)
AS
BEGIN
SELECT @studentname= Firstname+' '+Lastname,
@StudentEmail=email FROM tbl_Students WHERE studentid=@studentid
END

可以看出,上面的存储过程有三个参数,其中第一个是IN参数,而后两个是OUT参数,从过程主体可以看出,第一个out参数就是得到学生全名,第二个则是得到email的。
那么如何在服务器端查看执行后得到的结果呢?
代码如下:

Declare @Studentname as nvarchar(200) -- 申明第一个输出参数
Declare @Studentemail as nvarchar(50) -- 申明第二个输出参数
Execute GetstudentnameInOutputVariable 1 , @Studentname output, @Studentemail output
Select @Studentname,@Studentemail --“select”语句可以查看结果

好了,上面就是存储过程方面的一些知识,后续文章将会将游标,自定义错误,事物运行给包括进来,希望SQL在一步一步的学习中,坚实的成长起来。
推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 使用虚拟机配置服务器
    本文详细介绍了如何使用虚拟机配置服务器,包括购买云服务器的操作步骤、系统默认配置以及相关注意事项。通过这些步骤,您可以高效地配置和管理您的服务器。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 如何在服务器上配置SSL证书
    SSL证书是用于验证互联网上身份的一种数字凭证,通过启用HTTPS协议,确保用户与服务器之间的通信安全。本文将详细介绍如何在API和服务器上配置SSL证书,以提升网站的安全性和可信度。 ... [详细]
  • Ping 命令的高级用法与技巧
    本文详细介绍了 Ping 命令的各种高级用法和技巧,帮助读者更好地理解和利用这一强大的网络诊断工具。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
author-avatar
田景撩人_108
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有