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