各位用户为了找寻关于谈谈sqlserver自定义函数与存储过程的区别的资料费劲了很多周折。这里教程网为您整理了关于谈谈sqlserver自定义函数与存储过程的区别的相关资料,仅供查阅,以下为您介绍关于谈谈sqlserver自定义函数与存储过程的区别的详细内容
一、自定义函数:
1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数; 不能用临时表; 函数内部的操作不能影响到外部环境; 不能通过select返回结果集; 不能update,delete,数据库表; 3. 必须return 一个标量值或表变量 自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
1. 不能返回表变量 2. 限制少,可以执行对数据库表的操作,可以返回数据集 3. 可以return一个标量值,也可以省略return 存储过程一般用在实现复杂的功能,数据操纵方面。 ========================================================================= SqlServer存储过程--实例 实例1:只返回单一记录集的存储过程。 表银行存款表(bankMoney)的内容如下 Id userID Sex Money 001 Zhangsan 男 30 002 Wangwu 男 50 003 Zhangsan 男 40 要求1:查询表bankMoney的内容的存储过程
? 1 2 3 4 5create
procedure
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注* 在使用过程中只需要把T-Sql中的SQL语句替换为存储过程名,就可以了很方便吧! 实例2(向存储过程中传递参数):
加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。
? 1 2 3 4 5 6 7 8 9 10 11 12Create
proc insert_bank @param1
char
(10),@param2
varchar
(20),@param3
varchar
(20),@param4
int
,@param5
int
output
with
encryption
---------加密
as
insert
into
bankMoney (id,userID,sex,Money)
Values
(@param1,@param2,@param3, @param4)
select
@param5=
sum
(Money)
from
bankMoney
where
userID=
'Zhangsan'
go
在SQL Server查询分析器中执行该存储过程的方法是:
declare
@total_price
int
exec
insert_bank
'004'
,
'Zhangsan'
,
'男'
,100,@total_price
output
print
'总余额为'
+
convert
(
varchar
,@total_price)
go
在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容): 1.以Return传回整数 2.以output格式传回参数 3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。 实例3:使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19USE pubs
IF EXISTS (
SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type =
'P'
)
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname, au_fname, title, pub_name
FROM
authors a
INNER
JOIN
titleauthor ta
ON
a.au_id = ta.au_id
INNER
JOIN
titles t
ON
t.title_id = ta.title_id
INNER
JOIN
publishers p
ON
t.pub_id = p.pub_id
GO
au_info_all 存储过程可以通过以下方法执行:
EXECUTE
au_info_all
-- Or
EXEC
au_info_all
如果该过程是批处理中的第一条语句,则可使用:
au_info_all
实例4:使用带有参数的简单过程
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
CREATE
PROCEDURE
au_info
@lastname
varchar
(40),
@firstname
varchar
(20)
AS
SELECT
au_lname, au_fname, title, pub_name
FROM
authors a
INNER
JOIN
titleauthor ta
ON
a.au_id = ta.au_id
INNER
JOIN
titles t
ON
t.title_id = ta.title_id
INNER
JOIN
publishers p
ON
t.pub_id = p.pub_id
WHERE
au_fname = @firstname
AND
au_lname = @lastname
GO
au_info 存储过程可以通过以下方法执行:
EXECUTE
au_info
'Dull'
,
'Ann'
-- Or
EXECUTE
au_info @lastname =
'Dull'
, @firstname =
'Ann'
-- Or
EXECUTE
au_info @firstname =
'Ann'
, @lastname =
'Dull'
-- Or
EXEC
au_info
'Dull'
,
'Ann'
-- Or
EXEC
au_info @lastname =
'Dull'
, @firstname =
'Ann'
-- Or
EXEC
au_info @firstname =
'Ann'
, @lastname =
'Dull'
如果该过程是批处理中的第一条语句,则可使用:
au_info
'Dull'
,
'Ann'
-- Or
au_info @lastname =
'Dull'
, @firstname =
'Ann'
-- Or
au_info @firstname =
'Ann'
, @lastname =
'Dull'
实例5:使用带有通配符参数的简单过程
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25CREATE
PROCEDURE
au_info2
@lastname
varchar
(30) =
'D%'
,
@firstname
varchar
(18) =
'%'
AS
SELECT
au_lname, au_fname, title, pub_name
FROM
authors a
INNER
JOIN
titleauthor ta
ON
a.au_id = ta.au_id
INNER
JOIN
titles t
ON
t.title_id = ta.title_id
INNER
JOIN
publishers p
ON
t.pub_id = p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:
EXECUTE
au_info2
-- Or
EXECUTE
au_info2
'Wh%'
-- Or
EXECUTE
au_info2 @firstname =
'A%'
-- Or
EXECUTE
au_info2
'[CK]ars[OE]n'
-- Or
EXECUTE
au_info2
'Hunter'
,
'Sheryl'
-- Or
EXECUTE
au_info2
'H%'
,
'S%'
=
'proc2'
实例6:if...else 存储过程,其中@case作为执行update的选择依据,用if...else实现执行时根据传入的参数执行不同的修改.
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55--下面是if……else的存储过程:
if exists (
select
1
from
sysobjects
where
name
=
'Student'
and
type =
'u'
)
drop
table
Student
go
if exists (
select
1
from
sysobjects
where
name
=
'spUpdateStudent'
and
type =
'p'
)
drop
proc spUpdateStudent
go
create
table
Student
(
fName nvarchar (10),
fAge
smallint
,
fDiqu
varchar
(50),
fTel
int
)
go
insert
into
Student
values
(
'X.X.Y'
, 28,
'Tesing'
, 888888)
go
create
proc spUpdateStudent
(
@fCase
int
,
@fName nvarchar (10),
@fAge
smallint
,
@fDiqu
varchar
(50),
@fTel
int
)
as
update
Student
set
fAge = @fAge,
-- 传 1,2,3 都要更新 fAge 不需要用 case
fDiqu = (
case
when
@fCase = 2
or
@fCase = 3
then
@fDiqu
else
fDiqu
end
),
fTel = (
case
when
@fCase = 3
then
@fTel
else
fTel
end
)
where
fName = @fName
select
*
from
Student
go
-- 只改 Age
exec
spUpdateStudent
@fCase = 1,
@fName = N
'X.X.Y'
,
@fAge = 80,
@fDiqu = N
'Update'
,
@fTel = 1010101
-- 改 Age 和 Diqu
exec
spUpdateStudent
@fCase = 2,
@fName = N
'X.X.Y'
,
@fAge = 80,
@fDiqu = N
'Update'
,
@fTel = 1010101
-- 全改
exec
spUpdateStudent
@fCase = 3,
@fName = N
'X.X.Y'
,
@fAge = 80,
@fDiqu = N
'Update'
,
@fTel = 1010101