SQLServer存储过程

存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令,通俗来说,存储过程就是能完成一定操作的一组SQL语句,可视为批处理文件。

存储过程优势

  • 存储过程只在创造时进行编译,以后每次执行存储过程无需再次编译。
  • SQL语句每执行一次就编译一次,使用存储过程可提高数据库执行效率。
  • 当对数据库进行复杂操作时,可将复杂的操作用存储过程封装起来与事务结合一起使用。
  • 存储过程可重复使用,可减少数据库开发人员的工作量。
  • 存储过程安全性高,仅对特定用户开放权限。

存储过程缺点

  • 移植不便,存储过程依赖于数据库管理系统。
  • 不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装。
  • 代码可读性差,不移维护。
  • 不支持集群

SQL Server的存储过程是使用T_SQL编写的代码段,目的在于能够方便的完成数据库操作。T_SQL是SQL Server与应用程序之间的编程接口。

存储过程分类

  1. 系统存储过程

系统存储过程是SQL Server自身提供的存储过程,可作为命令执行操作。主要用来从系统表中获取信息,以完成数据库服务器的管理工作。

系统存储过程位于数据库服务器中,以sp_开头。系统存储过程定位在系统定义master和用户定义的数据库中,调用时不必在存储过程前添加数据库限定名。

  1. 用户存储过程/自定义存储过程

自定义存储过程即用户使用T_SQL语句编写的,为实现某特定业务需求。自定义存储过程可接收输入参数、向客户端返回结果、返回输出参数等。

创建自定义存储过程时

  • 存储过程前添加##表示创建全局的临时存储过程

  • 存储过程前添加#表示创建局部临时存储过程

局部临时存储过程只能在创建它的会话中使用,会话结束将被删除。两种存储过程都存放在tempdb数据库中。

用户定义的存储过程分为

  • T_SQL

T_SQL存储过程是指保存的T_SQL语句集合,可接收和返回用户提供的参数,存储过程也可能从数据库向客户端应用程序返回数据。

  • CLR
    CLR 存储过程是指引用Microsoft .NET Framework公共语言的方法存储过程,可接收和返回用户提供的参数。

增删改查

创建存储过程

-- 创建无参数的存储过程
IF(EXISTS (SELECT * FROM sys.objects WHERE name="getUsers"))
  DROP PROC prop_get_users
GO
CREATE PROCEDURE getUsers
AS 
SELECT * FROM Uses;

-- 调用执行存储过程
EXEC getBooks;
-- 创建带参数的存储过程
IF(EXISTS (SELECT * FROM sys.objects WHERE name="searchUsers"))
  DROP PROC proc_search_users
GO
CREATE PROC searchUsers(@UserID int)
AS 
SELECT * FROM Users WHERE UserID=@UserID;

-- 执行存储过程
EXEC searchUsers 100;
-- 创建带多个参数的存储过程
IF(EXISTS(SELECT * FROM sys.objects WHERE name="searchUsers"))
  DROP PROP proc_search_users
GO
CREATE PROC searchUsers(@UserID int, @UserName varchar(20))
AS
  SELECT * FROM Users WHERE UserID=@UserID AND UserName=@UserName;

-- 执行存储过程
EXEC searchUsers 100, "admin";
-- 创建带返回值的存储过程
IF(EXISTS (SELECT * FROM sys.objects WHERE NAME = "getUserID") )
  DROP PROC proc_get_userid
GO 
CREATE PROC getUserID(@UserName varchar(20), @UserID int output)
AS
  SELECT @UserID = UserID FROM Users WHERE UserName = @UserName;

-- 执行存储过程
DECLARE @id int -- 声明变量用于接收存储过程的返回值
EXEC getUserID "admin",@id output
SELECT @id AS UserID; -- AS 为返回的列起别名

修改存储过程

ALTER PROCEDURE dbo.getUsers
AS
SELECT auth FROM Users;

删除存储过程

DROP PROCEDURE getUsers;

重命名存储过程

sp_rename getUsers,proc_get_users

基础语法

-- 定义变量并赋值
declare @var int
set @var=1
print @var

-- 定义变量并使用select语句赋值
declare @var nvarchar(50)
select @var="superman"
print @var

declare @var nvarchar(50)
select @var = UserName from Users where UserID=1
print @var


-- 定义变量并使用update语句赋值
declare @var nvarchar(50)
update Users set @var=UserName where UserID=1
print @var

-- 创建临时表
create table #Tmp
{
  [UserID] [int] NOT NULL,
  [UserName] [nvarchar](50) NOT NULL,
  [Password] [nvarchar](max) NULL,
}

实例:

编写存储过程,传入分号间隔的两个字符串,将对应的字符串提取后插入数据表对应的列中,若存在则更新。

keys = "01;02;03"
vals = "superman;antman,ironman"

实例:查询用户表中是否存在某账户的记录

CREATE PROC checkUser
@UserName varchar(50)
@Output varchar(8) output
AS 
BEGIN
  IF(SELECT COUNT(1) FROM Users AS u WHERE u.UserName=@UserName)>0
  SET
    @Output = "success"
  ELSE
  SET
    @Output = "failure"
END
GO

DECLARE @output varchar(8)
EXEC checkUser "ironman",@output output
PRINT @output
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,928评论 2 89
  • 为了证明成熟 月光下的我化作樵夫 急不可耐地要去你的黑森林里伐木 你紧张地为我的爱之足套上一只水晶靴子 我涉水而过...
    想变白痴的人阅读 272评论 0 1
  • 儿子的小鱼阅读 86评论 0 0
  • 我不过像你 像他 像那野草 野花,冥冥中这是我唯一要走的路啊。时间无言 如此这般。明天已在via via。风吹过的...
    茶_凉阅读 161评论 0 0
  • 树 文/寒霜 【原创】 你直入云中飞舞 不是炫耀你的高度 默默做空中的清道夫 芳菲 文/寒霜 【原创】 静静绽放 ...
    刘寒霜阅读 168评论 20 26