14、SQL Server 存储过程
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 存储过程的更多相关文章
- Yii2.0调用sql server存储过程并获取返回值
1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- SQL Server存储过程Return、output参数及使用技巧
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- SQL Server 存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try
C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...
- sql server 存储过程使用游标记录
sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态 ...
- SQL Server存储过程输入参数使用表值
转载自:http://blog.csdn.net/smithliu328/article/details/9996149 在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使 ...
随机推荐
- python 学习笔记整理
首先自我批评一下,说好的一天写一篇博客,结果不到两天,就没有坚持了,发现自己做什么事情都没有毅力啊!不能持之以恒.但是,这次一定要从写博客开始来改掉自己的一个坏习惯. 可是写博客又该写点什么呢? 反正 ...
- 如何为企业选择最理想的Linux服务器系统?
[2013年10月12日 51CTO外电头条]什么样的Linux服务器最合适您的企业?简言之,它需要为员工带来工作所需的理想支持效果. 相对于成百上千种Linux桌面系统,Linux服务器系统的数量其 ...
- Count Good Substrings
Codeforces Round #258 (Div. 2) D:http://codeforces.com/problemset/problem/451/D 题意:给你一个字符串,只有ab组成.相同 ...
- ibatis动态的传入表名、字段名
ibatis动态的传入表名.字段名,主要传入表名和字段名的不一致. Java代码: Map<String,Object> params = new HashMap<String,Ob ...
- 关于sql语句in的使用注意规则( 转)
select * from tuser where userno not in(select userno from filter_barcode) 上面这条语句子查询里,userno 并不存在fil ...
- Java中如何创建进程(转)
在Java中,可以通过两种方式来创建进程,总共涉及到5个主要的类. 第一种方式是通过Runtime.exec()方法来创建一个进程,第二种方法是通过ProcessBuilder的start方法来创建进 ...
- 【HDOJ】4612 Warm up
双连通缩点+求树的直径,图论基础题目. /* 4612 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #in ...
- Linux Shell编程(27)——子shell
运行一个shell脚本时会启动另一个命令解释器. 就好像你的命令是在命令行提示下被解释的一样, 类似于批处理文件里的一系列命令.每个shell脚本有效地运行在父shell(parent shell)的 ...
- 2015第42周六Pgsql全文索引
全文搜索通常也就是文本搜索,它可以提供满足查询的识别自然语言的能力,并且任意性地通过相关性查询进行排序.搜索最常见的类型就是找到所有包含给定的查询术语的记录,并且以相似性的查询顺序返回它们. 对于普通 ...
- 网络流相关(拓扑)CodeForces 269C:Flawed Flow
Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...