TSQL 存储过程

存储过程的概念

T-SQL和C语言一样,是一门结构化的语言,他们具有类似的语法,

在C语言中使用函数可以提高代码段重用性,方便模块化设计,提高

执行效率。在C语言中使用函数的步骤:

  • 第一步:定义函数,指定函数的参数的执行代码。
  • 第二步:调用函数,通过函数的名称并指定相应的参数。

什么是存储过程

  • 存储过程(procedure)类似于C语言中的函数
  • 用来执行管理任务或应用复杂的业务规则
  • 存储过程可以带参数,也可以返回结果
  • 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等

存储过程的优点

  • 执行速度更快
  • 允许模块化程序设计
  • 提高系统安全性
  • 减少网络流通量

存储过程的分类:

系统存储过程

  • 由系统定义,存放在master数据库中
  • 类似C语言中的系统函数
  • 系统存储过程的名称都以“sp_”开头或”xp_”开头

用户自定义存储过程

  • 由用户在自己的数据库中创建的存储过程
  • 类似C语言中的用户自定义函数

SQL SERVER 中常用的存储过程

系统存储过程

说明

使用语法

Sp_columns

查看指定列的信息

Execute_sp_columns ‘表名’

Sp_databases

列出服务器上所有数据库

Execute_sp_databases

Sp_help

查看某个表的所有信息

Execute_sp_help ‘表名’

sP_helpconstraint

查看某个列的约束

Execute_sp_helpconstraint’b表名’

Ap_helpdb

列出指定数据库或所有数据库信息

Execute_sp_helpdb ‘数据库名称’  或 execute_sp_helpdb

Sp_helptext

显示数据库对象的定义文本

Execute_sp_helptext ‘对象名称’

Sp_helpindex

查看指定表的索引信息

Execute sp_helpindex ‘表名’

Sp_renamedb

更改数据库名称

Execte sp_renamedb ‘原名称’

Sp_stored_procedures

列出当前环境可用的所有存储过程

Execute sp_stored_porc_edures

Sp_tables

列出当前环境下的表和视图对象的信息

Execute sp_tables

 

注意:出了系统存储过程,sql erver 还提供以xp_开头的扩展存储过程。

可以调用DOS命令的XP_cmdshell 存储过程,语法如下:

1 Exec xp_xmdshell dos 命令 【no_output】
2 No_output 为可选参数。

调用存储过程

EXECUTE(执行)语句用来调用存储过程。

 EXEC  过程名  [参数]

如何创建存储过程

  • 定义存储过程的语法
  • 和C语言的函数一样,参数可选
  • 参数分为输入参数、输出参数
  • 输入参数允许有默认值
CREATE  PROC[EDURE]  存储过程名                @参数1  数据类型 = 默认值 OUTPUT,               …… ,              @参数n  数据类型 = 默认值 OUTPUT             
 AS             
SQL语句  
 GO 

创建不带参数的存储过程

1 create procedure proc_getpc 
2 --没有参数 as
3  select pcid as '电脑编号','使用状态'=case            when pcuse=0 then '空闲'        
4                  when pcuse=1 then '使用'                    end,     
5 pcnote as '备注' from pcinfo where pcuse=0 
6 go

存储过程的参数几种:

  • 输入参数
  • 输出参数
  • 输入参数

输出参数:

  • 用于在调用存储过程后
  • 返回结果,类似C语言的
  • 按引用传递;

带输出参数的存储过程

create procedure proc_getpcbyparam     
@pcuse int 
 as
 select pcid as '电脑编号', '是用状态'=case             when pcuse=0 then '空闲'             when pcuse=1 then '使用'         
                         end 
pcnote as '备注' from pcinfo where pcuse=@pcuse go

带参数的默认值

create procedure proc_getpcbyparam     
@pcuse int=0 
 as 
select pcid as '电脑编号', '是用状态'=case                 when pcuse=0 then '空闲'             when pcuse=1 then '使用'                 end
 pcnote as '备注' from pcinfo where pcuse=@pcuse go

调用带多个参数默认值的存储过程

  • Create  procedure  存储过程名称
  • 参数1  参数1数据类型=默认值,
  • 参数2  参数2数据类型=默认值   as……
  • EXEC 存储过程名称  --都采用默认值
  • EXEC 存储过程名称 参数1的值  --参数2采用默认值
  • EXEC 存储过程名称 参数1的值 ,参数2的值  --都不采用默认值 
  • 正确的调用方式:
  • EXEC 存储过程名 称参数2=参数2的值

带参数的存储过程

select @balance=cardbalance from cardinfo where cardid=@cardid

go

--调用存储过程

declare @balance int --定义变量,用于存放调用存储过程是返回的结果

exec proc_getbalance 4,@balance output

--判断余额

if @balance>0

       print '余额为'+Convert(varchar(5),@balance)+',此卡可用'

else

       print '余额为'+Convert(varchar(5),@balance)+',此卡需要充值'

go

return关键字

return关键字可以终止存储过程或者返回数值

return  返回数值

创建存储过程,用户新增电脑,并使用return返回新增电脑的编号

create procedure proc_addpc

       @pcnode varchar(20)

as

       --插入数据,默认使用状态为空闲

       insert into pcinfo values(0,@pcnode)

       --返回当前自动增长列的值

       return @@identity

go

--调用存储过程

declare @pcid int--声明变量,用于保存存储过程的返回值

--执行存储过程,为变量赋值,并指定输入参数

exec @pcid=proc_addpc '新增的电脑'

select @pcid as '新增电脑编号' --输出变量

return使用(终止程序)

create procedure proc_addbalance

       @cardnumber varchar(20) ,--充值的卡号

       @money int --充值金额

as

               --判读卡号是否存在

       if not exists(select 1 from cardinfo where cardnumber=@cardnumber)

       begin

            print '充值失败,卡号:'+Convert(varchar,@cardnumber)+'不存在。'

              return

       end

       if (@money<=0)

       begin

              print '充值失败,充值金额必须大于'

              return --终止存储过程的执行

       end

       --进行充值(修改余额)

      …….

go

PRINT语句的使用

  • 可指定严重级别
  • 设置系统变量@@ERROR
  • 记录所发生的错误等

RAISERROR语句的用法:

  • msg_id:在sysmessages系统表中指定用户定义错误信息
  • msg_str:用户定义的特定信息,最长255个字符
  • severity:定义严重性级别。用户可使用的级别为0–18级
  • state:表示错误的状态,1至127之间的值
  • option:指示是否将错误记录到服务器错误日志中
原文地址:https://www.cnblogs.com/xiongzhuang/p/3055475.html