SQL——存储过程

原文:SQL——存储过程

1. 为什么使用存储过程

应用程序通过T-SQL语句到服务器的过程是不安全的。

1) 数据不安全

2)每次提交SQL代码都要经过语法编译后在执行,影响应用程序的运行性能

3) 网络流量大

2. 什么是存储过程

存储过程是SQL语句和控制语句的预编译集合,保存在数据库里,可由应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。保存在SQLServer中,通过名称和参数执行,也可一返回结果。对于存储过程我更倾向于把他理解成方法。它里面可以只有一条查询语句,也可以包含一系列使用控制流的SQL语句。

3. 存储过程的优点

1) 模块化呈现设计

2) 执行速度快,效率高

3) 减少网络流量

4) 具有良好的安全性

4. 存储过程的分类

1)系统存储过程

2)扩展存储过程(属于系统存储过程的一种)

3)用户自定义存储过程

5. 系统存储过程

它一般以"sp_"开头,是由SQL Server创建、管理和使用,它存放在Resource数据库中。类似C#语言类库中的方法,暂时先不考虑它是如何编写的,先了解常用的系统存储过程及调用方法。

常见的系统存储过程,见下一篇文章

调用方法:exec[ute]  存储过程名  [参数值]

6.  常用的扩展存储过程   xp_cmdshell

xp_cmdshell  它可以完成DOS命令下的一些操作。

exec  xp_cmdshell  DOS命令  [no_output]

说明  no_output是可选参数,表示设置执行DOS命令后是否输出返回信息。

示例: exec xp_cmdshell  ‘mkdir  D:\newdir‘  output

强调: 因为用户可以通过xp_cmdshell对操作系统做一些操作,如果该存储过程被黑客使用对操作系统做操作就麻烦了,所以通常会把xp_cmdshell 关闭掉:

方法一:

SQL Server 2008版本及以上, 通过数据库右击  选择“方面”   ,在下拉列表中选择 “服务器安全‘ , 下面的列表项中可以看到xmcmdshellEnable 设置。

SQL Server2005版本及以下,通过开始- SQLServer- 外围设备查找

方法二:

关闭xp_cmdshell

EXEC sp_configure ‘show advanced options‘, 1;

RECONFIGURE;

EXEC sp_configure ‘xp_cmdshell‘, 1;

RECONFIGURE;

开启xp_cmdshell

EXEC sp_configure ‘show advanced options‘, 1;

RECONFIGURE;

EXEC sp_configure ‘xp_cmdshell‘, 0;

RECONFIGURE;

7. 用户自定义存储过程

语法:

create  proc[edure] 存储过程名

@参数1  数据类型 = 默认值 output,

……

@参数n  数据类型 = 默认值 output

as

<SQL 语句>

go

一个完成的存储过程包含以下3部分:

1) 输入参数、输出参数

2) 在存储过程中执行的T-SQL语句

3) 存储过程的返回值

其中输入参数允许有默认值。

删除存储过程

drop proc  存储过程名

if  exists (select * from sysobject where name = 存储过程名)

drop proc  存储过程名

go

8.  注意事项

存储过程的声明: 输入参数可以有默认值,输出参数也可以有默认值

create proc  usp_name

@age int = 5,

       @name varchar(10)

as

……

go

执行语句:

exec  pr_name  18 , ‘zm‘

exec  default  , ‘zm‘

exec  @name = ‘zm‘

说明: 为了调用方便,最好将有默认值的存储过程参数列表放到最后。

带输出参数的存储过程

create proc usp_name

@num1  int,

@sum int output

as

<SQL语句>

go

调用存储过程

declare @sum int

exec  usp_name  5, @sum  output

注意, 调用带有输出参数的存储过程参数后面必须带output关键字

9. 处理存储过程中的错误

raiserror  ( {msg_id  | msg_str} {, serverity, state } [with option [,……]])

其中:

msg_id: 在sysmessage系统表中指定用户定义错误信息

msg_str: 用户定义的特定信息,最长为255个字符

serverity: 与特定信息相关联,表示用户定义的严重性级别。用户可选用的级别是0~18。数字越大,表示越严重。

state : 表示错误的状态, 1~255中的值

option: 错误的自定义选项,可以使一下任意一值

    LOG: 在Microsoft SQl Server 数据库引擎示例的错误日志和应用程序日志中记录错误

NOWAIT:将消息立即发送给客户端

      SETERROR:将@@error值和 ERROR_NUMBER 值设置为msg_id 或5000, 不用考虑严重级别。

例如: raiserror (‘错误信息‘, 16,1)

时间: 2024-08-30 01:10:26

SQL——存储过程的相关文章

SQL存储过程和函数

SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定义:存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.和函数的区别在于,函数有返回值,存储过程没有. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度.2.当对数据库进行复杂操作时,

插入订单并且输出订单号的sql存储过程

--插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType varchar(30), @OrderTime DateTime, @OrderFirm varchar(300), @OrderMoney decimal(8,2), @SendWayMoney decimal(8,2), @RegisterId int, @CoalitionOrdersId in

创建sql自定义的函数及商品分页sql存储过程

--商品筛选时判断品牌ID是否存在 --select dbo.isValite(94,94)create function isValite(@brandId int,@bId int)returns intas begin Declare @rNumber int if @brandId = @bId set @rNumber = 1 else set @rNumber = 0 if @bId = 0 set @rNumber = 1 return @rNumberendgo --判断商品筛选

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

SQL 存储过程 分页

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: *** -- Create date: 2014-03-27 20:00 -- Description: 采用最新的 row_number() over 技术高效分页方法 -- ============================================= ALTER PRO

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

SQL存储过程实例详解

SQL存储过程实例详解 本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 stuID char(10) 学生编号,主键 stuName Varchar(10) 学生名称 major Varchar(50) 专业 图书表:book 字段名称 数据类型 说明 stuID char(10) 学生编号,主键 stuName Varchar(10) 学生名称 major Varchar(

《软件测试自动化之道》读书笔记 之 SQL 存储过程测试

<软件测试自动化之道>读书笔记 之 SQL 存储过程测试 2014-09-28 待测程序测试程序   创建测试用例以及测试结果存储  执行T-SQL脚本  使用BCP工具导入测试用例数据  创建T-SQL 测试套件  当待测存储过程返回行集的时候,如何判断测试结果是否通过  当待测存储过程返回out参数时,如何判断测试结果是否通过  当待测存储过程没有返回值时,如何判断测试结果是否通过 许多基于Windows的系统都使用了SQL Server作为后台组件.待测程序经常通过存储过程来访问数据库.

在SQL存储过程中给条件变量加上单引号

在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @where= '(DATEDIFF(day,'''+CONVERT(varchar(100), @d_start, 23)+''',sdate)>=0 and DATEDIFF(day,'''+CONVERT(varchar(100), @d_end, 23)+''',sdate)<=0) and ' +

sql 解析字符串添加到临时表中 sql存储过程in 参数输入

sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneColumnTabel('001,gf', ',') select * from 表 where ID in (select id from 临时表) Create function [dbo].[Func_SplitOneColumnTabel] (@str nvarchar(max),@split v