[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
数据库技术
> 详细
数据库的存储过程机制
时间:
2017-06-24 00:20:32
阅读:
482
评论:
0
收藏:
0
[点我收藏+]
什么是存储过程
如果你接触过其他的
编程
语言,那么就好理解了,存储过程就像是方法一样。竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值。
存储过程的优点:
存储过程的能力大大增强了SQL语言的功能和灵活性。
可保证数据的安全性和完整性。
通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。
可以降低网络的通信量。
使体现企业规则的运算程序放入数据库服务器中,以便 集中控制。
存储过程可以分为系统存储过程、扩展存储过程和用户自定义的存储过程
系统存储过程
我们先来看一下系统存储过程,系统存储过程由系统定义,主要存放在MASTER数据库中,名称以"SP"开头或以"XP"开头。尽管这些系统存储过程在MASTER数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 www.2cto.com
常用系统存储过程有:
exec sp_databases; --查看数据库
exec sp_tables; --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_helptext ‘sp_stored_procedures‘;--查看存储过程创建定义的语句
exec sp_stored_procedures;
exec sp_rename student, stuInfo;--更改表名
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb ‘master‘, ‘myDB‘;--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;
exec sp_attach_db --附加数据库
exec sp_detach_db --分离数据库
来看一下具体的代码:
exec sp_databases
--查看有哪些数据库
use MySchool
exec sp_tables
--可以看TABLE_OWNER字段显示DBO里确认是用户自己
exec sp_columns student
--除了用系统视图可以查看列,用系统存储过程也可以查看到列
exec sp_helpindex student
--查看索引,可以看到索引的描述,经过测试发现主键也是索种的一种
exec sp_helpconstraint student
--查看约束
exec sp_helptext ‘sys.all_columns‘
--查看系统视图
exec sp_helptext ‘sp_test‘
--查看用户自定义的存储过程
exec sp_stored_procedures
--查看全部的存储过程
exec sp_rename ‘student‘,‘stuInfo‘
--更改表名
use master
exec sp_renamedb ‘myschool‘,‘school‘
--更改数据库名,为了更改成功,不能使用当前数据库,需切换到其他数据库
exec sp_rename N‘student.idx_cid‘, N‘idx_cidd‘, N‘index‘;
--重命名索引
exec sp_helpdb
--数据库帮助,查询数据库信息
--分离数据库
use myschool
exec sp_detach_db ‘test‘;
--exec sp_attach_db --附加数据库
EXEC sp_attach_db @dbname = ‘test‘,
@filename1 = ‘D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test.mdf‘,
@filename2 = ‘D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test_log.ldf‘
www.2cto.com
用户自定义存储过程
在创建一个存储过程前,先来说一下存储过程的命名,看到好几篇讲存储过程的文章都喜欢在创建存储过程的时候加一个前缀,养成在存储过程名前加前缀的习惯很重要,虽然这只是一件很小的事情,但是往往小细节决定大成败。看到有的人喜欢这样加前缀,例如proc_名字。也看到这加样前缀usp_名字。前一种proc是procedure的简写,后一种sup意思是user procedure。我比较喜欢第一种,那么下面所有的存储过程名都以第一种来写。至于名字的写法采用骆驼命名法。
创建存储过程的语法如下:
CREATE PROC[EDURE] 存储过程名
@参数1 [数据类型]=[默认值] [OUTPUT]
@参数2 [数据类型]=[默认值] [OUTPUT]
AS
SQL语句
EXEC 过程名[参数]
来看一下各种不同的存储过程的实例:
45
--创建不带参数的存储过程
create procedure pro_student
as
select * from student;
--执行不带参数的存储过程
exec pro_student;
--修改不带参数的存储过程
alter procedure pro_student
as
select * from student where sid>3;
--执行修改后的存储过程
exec pro_student;
--删除存储过程
drop procedure pro_student;
--创建带输出参数的存储过程
create proc proc_getStudentRecord
(
@sex varchar(2) out, --输出参数
@age int output--输入输出参数
) www.2cto.com
as
select * from student where ssex = @sex and sage = @age;
--不缓存在存储过程
use myschool;
create procedure proc_recompileStudent
with recompile
as
select * from student
exec proc_recompileStudent
--
加密
的存储过程
create procedure proc_encrptStudent
with encryption
as
select * from student;
exec proc_recompileStudent
存储过程返回值的方式
1、返回数字类型的存储过程(还没有想到返回字符串的方法)
IF exists(select * from sys.objects where name=‘proc_getScore0‘)
drop procedure proc_getScore0
GO
create procedure proc_getScore0
(
@id int
)
AS
BEGIN
declare @score int
select @score=english from Score where id=@id
IF(@score>60)
return 0
ELSE
return 1
END
--测试调用返回数字的存储过程<br>declare @t int
EXEC @t = proc_getScore0 2
select @t;
--这里我遇到一个小问题,如果返回值是字符串,接收的时候declare @t nvarchar也出错,那该怎么做?
--暂时没有想到
2、返回变量的存储过程
IF exists(select * from sys.objects where name=‘proc_getScore‘)
drop procedure proc_getScore
GO www.2cto.com
CREATE PROCEDURE proc_getScore
@id int,
@result varchar(50) output
AS
BEGIN
declare @score int
select @score=english from Score where id=@id
IF(@score>60)
set @result=‘及格‘
ELSE
set @result=‘不及格‘
END
GO
--测试一
declare @id int
declare @temp varchar(50)
set @id=3
exec proc_getScore @id,@temp output
select @temp
最后一个例子,用C#来调用具有返回值的存储过程,这里我通过调用返回变量类型的存储过程来做测试。测试在控件台下进行,以下写了两种方法,第二种更好,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//方法一
//using (SqlConnection conn = new SqlConnection("server=.;database=myschool;uid=sa;pwd=123456"))
//{
// conn.Open();
// using (SqlCommand cmd = new SqlCommand("proc_getScore", conn))
// {
// cmd.CommandType = CommandType.StoredProcedure;
// cmd.Parameters.AddWithValue("@id", 2);
// SqlParameter sp = cmd.Parameters.Add("@result", SqlDbType.VarChar, 50); www.2cto.com
// sp.Direction = ParameterDirection.Output;
// cmd.ExecuteNonQuery();
// Console.Write(sp.Value);
// }
//}
//方法二
using (SqlConnection conn = new SqlConnection("server=.;database=myschool;uid=sa;pwd=123456"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("proc_getScore", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] paras = {
new SqlParameter("@id",SqlDbType.Int),
new SqlParameter("@result",SqlDbType.NVarChar,50)
};
paras[0].Value = 2;
paras[1].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(paras);
cmd.ExecuteNonQuery();
Console.Write(paras[1].Value);
} www.2cto.com
}
Console.ReadLine();
}
}
}
数据库的存储过程机制
原文:http://www.cnblogs.com/cxm12-/p/7072012.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!