sqlserver的存储过程与用户定义的函数区别和联系
发布时间:2020-12-12 15:54:54 所属栏目:MsSql教程 来源:网络整理
导读:? Sqlserver中的存储过程可以写在2个地方。一个是存储过程下面,还有一个是用户定义的函数下面,下面我就这2个下面的存储过程分别说下他们的区别和联系。 ? 对于java代码来说,这2个下面的调用方法都是一样的。(试想下,如果不一样的话,那么岂不是乱了。就
?
Sqlserver中的存储过程可以写在2个地方。一个是存储过程下面,还有一个是用户定义的函数下面,下面我就这2个下面的存储过程分别说下他们的区别和联系。
?
对于java代码来说,这2个下面的调用方法都是一样的。(试想下,如果不一样的话,那么岂不是乱了。就是为了减少代码的修改次数才写得存储过程。)这2个下面的存储过程下面分别给了1个例子。
?
1 用户定义的函数:
CREATE function fun_insert(@count varchar(100),@fnames varchar(100),@faddr varchar(100))
returns varchar(100)
?
AS
begin
?
declare @tcount integer
declare @str varchar(100)
select @tcount=count(*)+1 from men
set @str = 'a你输入的是'+@fnames+@faddr+'一共有'+str(@count)+'条数据'
return @str
end
?
2 存储过程
CREATE PROCEDURE InsertUser
@loginName varchar(50),
@realName varchar(50),
@password varchar(50),
@userId int output
?
As
Set NOCOUNT ON
If Exists (select userID from tsysuser Where loginName = @loginName)
RETURN 0
ELSE
Begin
INSERT INTO tsysuser (loginName,realName,password) VALUES(@loginName,@realName,@password)
SET @userID = @@IDENTITY
RETURN @userID
Set NOCOUNT OFF
End
GO
?
这里先说下小弟苦苦找了半天的一个错。就是函数里只能使用insert,update,delete来操作函数内定义的[[表变量]],不能操作[[表对象]].。所以,在用户定地的函数中不能直接操作实体表。只可以操作内建表。这是首先要了解的。我就是在这上面找了快半天了。
?
声明方面:
除了create后面的那个关键字不同之外。用户自定义函数需要用括号包住输入的参数,并且返回值需要在表头中声明。而存储过程不加括号,并且不声明返回值。也就是说,存储过程的返回值是需要在里面中体现的。单看表头并不知道返回值的类型。
?
包体方面:
声明后面都是as关键字,这是一样的。但是后面就不太一样了。
用户自定义的函数是由一对begin和end包住中间的代码体。Begin代表存储过程的开始。End代表存储过程的结束。
存储过程虽然也是as开始。但是有一对Set NOCOUNT ON和Set NOCOUNT OFF。并且最后在end后面还加上了一个GO关键字。Set NOCOUNT ON和Set NOCOUNT OFF是优化存储过程代码的标示。具体不细说。Baidu下就知道了。
?
相同的特点:
声明变量的时候都是用@符号开始。赋值用Set关键字。这是2个不同包下面代码的相同点。也是和oracle不同的地方。具体的语法还是baidu下吧。这里只是简单的介绍下。其实很多东西只要知道有救行。具体的还得实际操作。知道大概其的规则了,遇到问题了再细化也很快的。行,先写这么多。上班没活干啊。。。睡觉 Zzzzzz….
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |