什么是存储过程
如果你接触过其他的编程语言,那么就好理解了,存储过程就像是方法一样。
竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值。
存储过程的优点:
存储过程的能力大大增强了SQL语言的功能和灵活性。
1.可保证数据的安全性和完整性。
2.通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
3.通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
4.在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程。
5.可极大地改善SQL语句的性能。
6.可以降低网络的通信量。
7.使体现企业规则的运算程序放入数据库服务器中,以便 集中控制。
存储过程可以分为系统存储过程、扩展存储过程和用户自定义的存储过程
系统存储过程
我们先来看一下系统存储过程,系统存储过程由系统定义,主要存放在MASTER数据库中,名称以"SP"开头或以"XP"开头。尽管这些系统存储过程在MASTER数据库中
但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。
常用系统存储过程有:
代码如下:
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 --分离数据库
存储过程语法:
在创建一个存储过程前,先来说一下存储过程的命名,看到好几篇讲存储过程的文章都喜欢在创建存储过程的时候加一个前缀,养成在存储过程名前加前缀的习惯很重要,虽然这只是一件很小的事情,但是往往小细节决定大成败。看到有的人喜欢这样加前缀,例如proc_名字。也看到这加样前缀usp_名字。前一种proc是procedure的简写,后一种sup意思是user procedure。我比较喜欢第一种,那么下面所有的存储过程名都以第一种来写。至于名字的写法采用骆驼命名法。
创建存储过程的语法如下:
代码如下:
CREATE PROC[EDURE] 存储过程名
@参数1 [数据类型]=[默认值] [OUTPUT]
@参数2 [数据类型]=[默认值] [OUTPUT]
AS
SQL语句
EXEC 过程名[参数]
使用存储过程实例:
1.不带参数
代码如下:
create procedure proc_select_officeinfo--(存储过程名)
as select Id,Name from Office_Info--(sql语句)
exec proc_select_officeinfo--(调用存储过程)
2.带输入参数
代码如下:
create procedure procedure_proc_GetoffinfoById --(存储过程名)
@Id int--(参数名 参数类型)
as select Name from dbo.Office_Info where Id=@Id--(sql语句)
exec procedure_proc_GetoffinfoById 2--(存储过程名称之后,空格加上参数,多个参数中间以逗号分隔)
注:参数赋值是,第一个参数可以不写参数名称,后面传入参数,需要明确传入的是哪个参数名称
DEMO1:
create proc proc_ta --不带参数的存储过程
as
begin
select [Country],[IATACode] from [Test].[dbo].[Ta]
end
go
select * from [Test].[dbo].[Ta]
go
exec proc_ta --查看存储过程
go
DEMO2:
create proc proc_select_ta
(
@Country int
)
as
begin
select * from [Test].[dbo].[Ta] where Country=@Country --带参数的存储过程
end
函数
SQL Aggregate 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
AVG() - 返回平均值
SELECT AVG(column_name) FROM table_name
COUNT() - 返回行数
SELECT COUNT(column_name) FROM table_name;
FIRST() - 返回第一个记录的值
SELECT FIRST(column_name) FROM table_name;
LAST() - 返回最后一个记录的值
SELECT LAST(column_name) FROM table_name;
MAX() - 返回最大值
SELECT MAX(column_name) FROM table_name;
MIN() - 返回最小值
SELECT MIN(column_name) FROM table_name;
SUM() - 返回总和
SELECT SUM(column_name) FROM table_name;
SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
UCASE() - 将某个字段转换为大写
SELECT UCASE(column_name) FROM table_name;
LCASE() - 将某个字段转换为小写
SELECT LCASE(column_name) FROM table_name;
MID() - 从某个文本字段提取字符,MySql 中使用
SELECT MID(column_name,start[,length]) FROM table_name;
SubString(字段,1,end) - 从某个文本字段提取字符
SELECT SubString(column_name,1,end) FROM table_name;
LEN() - 返回某个文本字段的长度
SELECT LEN(column_name) FROM table_name;
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
SELECT ROUND(column_name,decimals) FROM table_name;
NOW() - 返回当前的系统日期和时间
SELECT NOW() FROM table_name;
FORMAT() - 格式化某个字段的显示方式
SELECT FORMAT(column_name,format) FROM table_name;
区别
1.储存过程可以有返回值也可以无返回值。函数必须有返回值。
2.存储过程的实现比较复杂,而函数的实现比较有针对性。
3.储存过程可以输入输出参数,而函数只可以输入参数。
4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。
5.可以在存储过程中调用函数,不可以在函数中调用存储过程。