微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver的存储过程与用户定义的函数区别和联系

 
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….

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐