SQL Server 存储过程

存储过程类似函数,可以重复使用。相对于函数,存储过程拥有更强大的功能和更高的灵活性。

存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或多个结果集。

存储过程带来的好处:

1、性能的提升

存储过程执行时,第一次会进行编译和优化。但批处理T-SQL语句每次执行都需要预编译和优化,所以没有存储过程快。

2、易于维护

存储过程创建后存储在数据库中,可以被程序多次调用执行。当需要修改存储过程时,对应用程序代码毫无影响。

3、安全性

应用程序只需要调用存储过程名,给几个参数,而不是直接访问基础对象。需要赋予的不是增删改的权限,而是exec的权限。

系统存储过程

系统存储过程主要存储在master数据库中,以sp_开头,可以在所有数据库对象中使用。

常用的系统存储过程

exec sp_databases    --查看所有数据库
exec sp_tables --查看所有数据表
exec sp_columns student --查看student表的所有列
exec sp_helpIndex student --查看student表的索引
exec sp_helpconstraint student --查看student表的约束
exec sp_helptext 'sp_databases' --查看定于语句
exec sp_rename oldName,newName --修改表、索引、列的名称
exec sp_renamedb webDB,newDB --修改数据库名称
exec sp_helpdb webDB --查看数据库信息

用户定义存储过程

语法:

create proc | procedure proc_name
[
{@parameter1 data_type} [=default] [out | output],
{@parameter2 data_type} [=default] [out | output]
]
as
[begin]
T-SQL代码
[end]

不带参数

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test --创建create 修改alter
as
select * from student order by id desc
--调用
exec proc_test

执行存储过程使用execute关键字,可以简写为exec。在SQL Server 2012中得到加强,可以修改结果集中列名和类型。

execute proc_test
with result sets
(
(
序号 varchar(5),
姓名 varchar(10),
性别 varchar(2),
年龄 varchar(5),
邮箱 varchar(5)
)
)

输入参数

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test (@id int)
as
select * from student where id = @id --调用
exec proc_test 10

默认参数

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test (@id int = 10)
as
select * from student where id = @id --调用
exec proc_test --
exec proc_test 15 --

输出参数

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test (
@id int, --输入参数
@name varchar(10) out, --输出参数
@age int output --输入输出参数
)
as
begin --可写可不写
select @name = name,@age = age from student where id = @id
end --调用
declare @name varchar(10),@age int
exec proc_test 10,@name out,@age output
select @name,@age

不缓存

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test
with recompile --不缓存,每次都编译
as
select * from student order by id desc
--调用
exec proc_test

加密

if(exists(select * from sys.objects where name = 'proc_test'))
drop proc proc_test --删除
go
create proc proc_test
with encryption --加密后无法查看
as
select * from student order by id desc
--调用
exec proc_test
exec sp_helptext proc_test
--提示对象 'proc_test' 的文本已加密。

14、SQL Server 存储过程的更多相关文章

  1. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

  2. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  3. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  4. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  5. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  6. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  7. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

  8. sql server 存储过程使用游标记录

    sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态 ...

  9. SQL Server存储过程输入参数使用表值

    转载自:http://blog.csdn.net/smithliu328/article/details/9996149 在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使 ...

随机推荐

  1. Rails中的测试RSpec升级遇到的问题

    bundle exec rspec spec/ /home/wuxj/Prac/rrprac/sample_app/spec/spec_helper.rb::in `block in <top ...

  2. 写个自动安装JDK的shell脚本

    #!/bin/bash ################################################# # # INSTALL JDK AUTOMATICALLY # # auth ...

  3. CFUUIDRef和CFStringRef-生成唯一标识符

    - (NSString *)createCUID:(NSString *)prefix{ NSString *  result; CFUUIDRef   uuid; CFStringRef uuidS ...

  4. java 伪共享

    MESI协议及RFO请求典型的CPU微架构有3级缓存, 每个核都有自己私有的L1, L2缓存. 那么多线程编程时, 另外一个核的线程想要访问当前核内L1, L2 缓存行的数据, 该怎么办呢?有人说可以 ...

  5. HDU-4925 Apple Tree

    http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others)     ...

  6. Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3241  Solved: 1437[Submit][Status][Discuss ...

  7. [cocos2dx 3.0 + xcode]疑难点记录

    1: 新项目创建 1.下载最新Python,安装 2.解压引擎包 3.运行终端,切换到引擎目录(直接cd拖动文件夹到光标即可得到路径) 4.按照文档例子: $ cd cocos2d-x $ ./set ...

  8. Sicily1153-马的周游问题:启发式搜索

    代码地址: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1153.c 题目如下: 1153. 马的周游问题 C ...

  9. ADB server didn't ACK的问题

    今天出现eclipse用手机调试时,一直起不来,出现ADB server didn't ACK,提示restart adb或者重启eclipse,按照原来的,查看了任务管理器中,没发现已经启动的adb ...

  10. m版页面判断安卓与ios系统

    安卓系统和ios系统,在做app里面嵌入m版时,有时候会发现,ios上面的那个电池状态栏不占位置,但是安卓的状态栏占位,所以需要区分系统样式单独处理一下! var sUserAgent=navigat ...