最近在做人事档案管理系统,不管是在程序中还是在SQL Server 中,时常都会用的函数。数据中的函数从刚开
始学习数据库时就已经开始使用了,但是刚开始的时候对存储过程并不了解,只是知道有这么一个内容。现在就来说
说关于存储过程与函数的异同,首先我们需要来了解一下关于存储过程与函数的定义。
一.定义
1.存储过程
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句
和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通
过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进
行编译,所以执行起来比单个 SQL 语句快。
例如:
Create PROCEDURE [dbo].[PROC_CR_Insert_OnComputerRecord]
@StudentCardID char(11), --卡号
@Ondate date , --上机日期
@Ontime char(10) , --上机时间
@ComoputerNo char(20) --机房号
As
begin
set NOCOUNT ON;
set XACT_ABORT ON;
begin tran --开始事务
select StudentID,StudentName,StudentSex,Studenttype,Department ,Cash from StudentBasicInfo
where StudentCardID =@StudentCardID ;
insert into OnOffComputer (StudentCardID ,Ondate ,Ontime,ComputerNo)
values (@StudentCardID ,@Ondate ,@Ontime ,@ComoputerNo )
COmmit tran --提交事务
end
exec PROC_CR_Insert_OnComputerRecord '1','20130821','8:00','11' --执行语句--
结果为:
以上的存储过程的作用是插入上机信息.
2.函数
函数是由一个或多个 Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。Microsoft SQL Server?
2000 并不将用户限制在定义为 Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用 CREATE FUNCTION 语句创建、使用 ALTER FUNCTION 语句修改、以及使用 DROP FUNCTION 语句除去
用户定义函数。每个完全合法的用户定义函数名 (database_name.owner_name.function_name) 必须唯一。
必须被授予 CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-
SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK 约束、
DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES 权限。
例如:
-- =============================================
-- Author: 唐欢
-- Create date: 2013-8-16
-- Description: 提供中文首字母
-- =============================================
create FUNCTION [dbo].[fun_getPY]
(
@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1),@PY NVARCHAR(4000)
SET @PY=''
WHILE len(@str)>0
BEGIN
SET @word=left(@str,1)
SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901
THEN (SELECT TOP 1 PY FROM (
SELECT 'A' AS PY,N'驁' AS word
UNION ALL SELECT 'B',N'簿'
UNION ALL SELECT 'C',N'錯'
UNION ALL SELECT 'D',N'鵽'
UNION ALL SELECT 'E',N'樲'
UNION ALL SELECT 'F',N'鰒'
UNION ALL SELECT 'G',N'腂'
UNION ALL SELECT 'H',N'夻'
UNION ALL SELECT 'J',N'攈'
UNION ALL SELECT 'K',N'穒'
UNION ALL SELECT 'L',N'鱳'
UNION ALL SELECT 'M',N'旀'
UNION ALL SELECT 'N',N'桛'
UNION ALL SELECT 'O',N'漚'
UNION ALL SELECT 'P',N'曝'
UNION ALL SELECT 'Q',N'囕'
UNION ALL SELECT 'R',N'鶸'
UNION ALL SELECT 'S',N'蜶'
UNION ALL SELECT 'T',N'籜'
UNION ALL SELECT 'W',N'鶩'
UNION ALL SELECT 'X',N'鑂'
UNION ALL SELECT 'Y',N'韻'
UNION ALL SELECT 'Z',N'咗'
) T
WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS
ORDER BY PY ASC) ELSE @word END)
SET @str=right(@str,len(@str)-1)
END
RETURN @PY
END
select * from T_BasicInformation where dbo.fun_getPY(name) like N'%TH%' --执行语句--
结果为:
这个函数的作用是按拼音查询!
二.存储过程与函数的同
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的
SQL语句。存储过程与函数的执行本质是一样的。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而
且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。
当存储过程和函数被执行的时候,SQLManager会到PRocedure cache中去取相应的查询语句,如果在procedure
cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
三。存储过程与函数的异
总结:
存储过程和函数都是被封装好的SQL 语句集合体,在SQL Server 中巧妙的使用存储过程和函数,有理由执行效
率的提高。如何选择使用存储过程和函数,需要根据自己需求来决定,同时也要合理的使用存储过程和函数,如果滥用
存储过程和函数,会更调试人员和后期人员带来很大的麻烦,因为存储过程或是函数是放在数据库中的,不易调试!