您好,欢迎访问一九零五行业门户网

php:SQL Server用户自定义的函数种类详解

关于sql server用户自定义的函数,有标量函数、表值函数(内联表值函数、多语句表值函数)两种。
题外话,可能有部分朋友不知道sql serve用户自定义的函数应该是写在哪里,这里简单提示一下,在microsoft sql server managerment studio里面,展开具体需要创建sql server用户自定义函数的数据库(即每个用户自定义函数只针对具体的一个数据库有用),然后找到可编程性选项,再展开找到函数选项,在具体的函数选项里面可参照下图的方式鼠标右键选择来添加。
所谓标量函数简单点来讲就是返回的结果只是一个标量,对于我来讲,返回的结果就是一种类型的一个值。 
写法如下:
create function <scalar_function_name, sysname, functionname> ( -- add the parameters for the function here <@param1, sysname, @p1> <data_type_for_param1, , int> ) returns <function_data_type, ,int> as begin -- declare the return variable here declare <@resultvar, sysname, @result> <function_data_type, ,int> -- add the t-sql statements to compute the return value here select <@resultvar, sysname, @result> = <@param1, sysname, @p1> -- return the result of the function return <@resultvar, sysname, @result>
create function getsum ( @firstnum int, @secondnum int ) returns int as begin -- declare the return variable here declare @result int -- add the t-sql statements to compute the return value here select @result=@firstnum+@secondnum -- return the result of the function return @result
题外话:我们来看看上面的写法,对于sql server来讲,我们声明一个变量的方式是用@变量名,而且相对于编程来讲,sql server声明的方式跟我们开了个玩笑,是先变量后面才是类型。对于需要传参跟不需要传参的方式,其实跟我们编程的方式一样。有参数则是如下方式:
create function getsum ( @firstnum int, @secondnum int )
如果没有参数,则只要保留括号即可。跟我们理解的函数写法一致。
create function getsum ( )
对于返回方式,这跟我们编程的方式又不大一样。sql server函数的返回类型并不放在函数名前面,而是函数名括号的后面。而且函数的返回类型需要用到返回关键字returns,而不是return。
对于函数来讲,当然也会有所谓的函数体。标量函数也一样。它的函数体是包含在:
as begin -- 函数体 end

对于需要在函数体里面声明变量的话,则需要使用到declare关键字进行声明。函数体内的返回才是关键字return。
好了,标量函数的例子也举完了,要存到数据库里面,还需要点击microsoft sql server management studio工具里的执行操作。这样之后,就可以在查询窗口里面跟查询表数据一样来查询结果了。
使用方式好懂吧,但是需要注意的是[dbo]这个对象名在不能省,[getsum]函数后面可也别少了()。说来也奇怪,对于表值函数来说,对象名[dbo]倒是不写也可以正确执行。
select [dbo].[getsum]()
相对于标量函数只返回一个标量值,内联表值函数返回的是表数据。当然罗,表数据就是table类型。
写法如下:
create function <inline_function_name, sysname, functionname> ( -- add the parameters for the function here <@param1, sysname, @p1> <data_type_for_param1, , int>, <@param2, sysname, @p2> <data_type_for_param2, , char> ) returns table as return ( -- add the select statement with parameter references here select 0 ) go
create function [getmorethansalary] ( @salary int ) returns table as return ( select [fname],[fcity],[fage],[fsalary] from [demo].[dbo].[t_person] where [fsalary] > @salary )
题外话:标量函数上面提过的内容,这里就不重复了。内联表函数返回的表结构由函数体内的select语句来决定。
对于标量函数来讲,函数体是包含在如下结构中。
as begin -- 函数体 end

但是对于内联表值函数来讲,函数体的结构则是如下的方式。内联表值函数只执行一条sql语句后返回table结果。
as return -- 函数体 end
执行表值函数的方式如下:
select [fname],[fcity],[fage],[fsalary] from [dbo].[getmorethansalary](8000)
可以看得出,这种执行方式就跟普通表的执行方式一样了。表值函数其实相当于存储在内存空间里面的一张虚拟表。
多语句表值函数跟内联表值函数都是表值函数,它们返回的结果都是table类型。多语句表值函数顾名思义,就是可以通过多条语句来创建table类型的数据。这里不同于内联表值函数,内联表值函数的返回结果是由函数体内的select语句来决定。而多语句表值函数,则是需要指定具体的table类型的结构。也就是说返回的table,已经定义好要哪些字段返回。所以它能够支持多条语句的执行来创建table数据。
create function <table_function_name, sysname, functionname> ( -- add the parameters for the function here <@param1, sysname, @p1> <data_type_for_param1, , int>, <@param2, sysname, @p2> <data_type_for_param2, , char> ) returns <@table_variable_name, sysname, @table_var> table ( -- add the column definitions for the table variable here <column_1, sysname, c1> <data_type_for_column1, , int>, <column_2, sysname, c2> <data_type_for_column2, , int> ) as begin -- fill the table variable with the rows for your result set return end go
alter function demofun ( ) returns @result table ( name nvarchar(20), city nvarchar(20), age int, salary int ) as begin -- fill the table variable with the rows for your result set insert into @result(name, city, age, salary) select fname,fcity,fage,fsalary from dbo.t_person where fsalary>8000 insert into @result(name, city, age, salary) values ('测试','china', 1, 0) return end go
题外话:可以看得出,多语句表值函数的返回结果是定义好表结构的虚拟表。这又跟标量函数一样了吧,只不过标量函数是返回一种类型的标量值而已。而且在多语句表值函数里面,你也会发现最后一句是return。告诉执行程序,多语句表值函数已经执行完成。函数体结构跟标量函数的结构一样。对于类型放在变量后面这种方式确实需要好好转换一下观念。
returns <@table_variable_name, sysname, @table_var> table ( -- add the column definitions for the table variable here <column_1, sysname, c1> <data_type_for_column1, , int>, <column_2, sysname, c2> <data_type_for_column2, , int> )
内容倒是不多,但是要熟练使用的话,还是需要在项目中多加使用才行。网上有一些网友总结出来的常用自定义函数大家可以收集积累,就像做项目一样,好的方法要形成所谓的开发库,帮助我们在下一个项目中复用。节省我们的开发时间,提高我们的工作效率。
以上就是php:sql server用户自定义的函数种类详解的详细内容。
其它类似信息

推荐信息