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. poj 2778 DNA Sequence AC自动机

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11860   Accepted: 4527 Des ...

  2. IndexedDB demo showcase

    var dbGlobals = new Object(); dbGlobals.db = null; dbGlobals.description = "This database is us ...

  3. 几个外国Delphi Blog网站

    http://blog.blong.com/search?updated-max=2012-09-19T03:21:00-07:00&max-results=7&start=42&am ...

  4. java static 执行顺序

    先加载类,然后再实例化类. 继承与static 面试题目如下:请写出程序执行完成之后的结果. package extend; public class X { Y y=new Y(); static{ ...

  5. Solr -- Solr Facet 2

    solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会 ...

  6. Java项目中使用配置文件配置

    private String readConfig() { Properties p = new Properties(); InputStream in = getClass().getClassL ...

  7. Unity5 Screen-Space Subsurface Scattering屏幕空间次表面散射SSSSS

    用unity5自带的standard shader        ------------by wolf96 

  8. 用GPUImage开启相机并且开启滤镜效果

    GPUImage提供了GPUImageVideoCamera这么一个类,它的对象能够调用摄像头,并且加上滤镜的效果.     //init VideoCamera     //这里的两个参数可以设定拍 ...

  9. jboss as7 o.h.c.s.c.i.BroadcastGroupImpl Network is unreachable

    Question: [Server:server-one] 22:52:56,876 ERROR [org.hornetq.core.server.cluster.impl.BroadcastGrou ...

  10. [Git] Github上传新repository后自动合并

    原因是新repository中有个与老repository一模一样的名字为".git"的隐藏文件夹,删去后即可: 将整个工程直接复制粘贴出此错误...好蠢: Github控制项目的 ...