sqlserver中的表值函数和标量值函数

原创 2017年11月14日 17:41:07

顾名思义:表值函数返回的是表,而标量值函数可以返回基类型

一、表值函数

用户定义表值函数返回 table 数据类型,表是单个 SELECT 语句的结果集。

以下示例:

CREATE FUNCTION F3_GetEmployeeSalary
(
	@EmployeeID VARCHAR(50) --参数
)
RETURNS TABLE  --返回类型为表
AS
RETURN
(
	SELECT * FROM dbo.TEmployee
	WHERE EmployeeID = @EmployeeID   --通过一条sql查询语句获取表中数据
)

 --函数调用
SELECT * FROM F3_GetEmployeeSalary('1')
注意:

1)只能返回Table,returns后边一定是table

2)as后面没有begin/end,只有一个return语句返回特定的记录


对于多语句表值函数,在 BEGIN...END 语句块中定义的函数体包含一系列 Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。

以下示例:

CREATE FUNCTION [dbo].[F_SQLSERVER_SPLIT](@Long_str varchar(8000),@split_str varchar(100))    
RETURNS  @tmp TABLE(        
    ID int IDENTITY PRIMARY KEY,      
    short_str varchar(8000)    
)    
AS   
BEGIN   
    DECLARE @long_str_Tmp varchar(8000),@short_str varchar(8000),@split_str_length int   
    SET @split_str_length = LEN(@split_str)    
    IF CHARINDEX(@split_str,@Long_str)=1 
         SET @long_str_Tmp=SUBSTRING(@Long_str,@split_str_length+1,LEN(@Long_str)-@split_str_length)
    ELSE
         SET @long_str_Tmp=@Long_str
    IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1    
        SET @long_str_Tmp=@long_str_Tmp+@split_str    
    ELSE   
        SET @long_str_Tmp=@long_str_Tmp    
    IF CHARINDEX(@split_str,@long_str_Tmp)=0
        Insert INTO @tmp select @long_str_Tmp 
    ELSE
        BEGIN
            WHILE CHARINDEX(@split_str,@long_str_Tmp)>0    
                BEGIN   
                    SET @short_str=SUBSTRING(@long_str_Tmp,1,CHARINDEX(@split_str,@long_str_Tmp)-1)    
                    DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int   
                    SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)    
                    SET @split_str_Position_END = LEN(@short_str)+@split_str_length    
                    SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,@long_str_Tmp_LEN-@split_str_Position_END))
                    IF @short_str<>'' Insert INTO @tmp select @short_str    
                END           
        END
    RETURN     
END

--函数调用
select * from F_SQLSERVER_SPLIT('a,b,c',',')
注意:

1)returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。(实质上是定义了一个表变量)

2)在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3)最后只需要return,return后面不跟任何变量。(返回的是表变量里面的数据)

二、标量值函数

以下示例:

CREATE FUNCTION dbo.F3_GetMax
(
	@a INT,   --函数的两个参数
	@b INT
)
RETURNS INT --返回类型为INT
AS
BEGIN
	DECLARE @max INT;
	IF(@a>=@b)
	BEGIN
		SET @max = @a;
	END
	ELSE
	BEGIN
		SET @max = @b
	END

	RETURN @max;  --最后return返回@max中的值
END

--调用函数
SELECT dbo.F3_GetMax(2,3);
注意:

(1)必须使用两部分组成函数的名字来调用函数,即所有者.对象名,如dbo.F3_GetMax(2,3)

(2)所有的传入参数前必须加@

(3)不要写漏和写错关键字,如as,returns,return

(4)returns后面不是跟一个变量,而是跟变量的返回值类型

(5)在begin/end语句块中,使用的是return


版权声明:本文为博主原创文章,未经博主允许不得转载。

sqlserver自定义函数(标量值函数,表值函数)

在sqlserver中,根据函数返回值形式的不同将用户自定义的函数分为”标量值函数“和”表值函数“两种类型。如下图所示,可以在数据库中的可编程->函数中进行查看。 标量函数,返回单个值,表值函数返...
  • u014555474
  • u014555474
  • 2015年03月26日 22:07
  • 1698

sql中的表值函数与标量值函数区别与用法

通俗来讲: 听名字就知道区别了  表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂; 标量值函数返回的只是一个值 一 、表值函数又分为内联函数与多语句函数...
  • qq_28643437
  • qq_28643437
  • 2017年07月25日 16:13
  • 793

sqlserver中的表值函数和标量值函数

顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一、表值函数 用户定义表值函数返回 table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。 ...
  • qwlovedzm
  • qwlovedzm
  • 2017年06月16日 11:30
  • 297

表值函数,标量值函数详解

顾名思义:表值函数返回的是表,而标量值函数可以返回基类型表值函数用户定义表值函数返回 table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。以下示例创建了一个内联...
  • deepwishly
  • deepwishly
  • 2010年01月28日 12:53
  • 8445

SQL存储过程调用标量值函数,存储过程调用存储过程

一、存 储过程调用标量值函数 先建一个标量值函数,如 CREATE FUNCTION [dbo].[F_Num] ( @a nvarchar(50) ) RETURNS nvarchar(...
  • jys1216
  • jys1216
  • 2011年11月05日 00:08
  • 3721

SQL Server函数——表值函数和标量函数

create table student (  sid int identity primary key,  sname varchar(20),  gender tinyint,  age...
  • ljxqsqmoliwei
  • ljxqsqmoliwei
  • 2015年06月04日 10:28
  • 1268

EF中使用数据库的标量值函数

数据库中的自定义函数,如果是表值函数,EF
  • leftfist
  • leftfist
  • 2014年09月15日 20:56
  • 4228

SQL 标量函数&表值函数

标量函数:标量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值。 标量值函数示例: CREATE FUNCTION dbo.Foo() RETURNS int AS  BEGI...
  • yaohaishen
  • yaohaishen
  • 2015年06月20日 09:48
  • 935

SQL Server 2008 创建标量值函数、存储过程

在运用数据库的过程中,需要用到标量值函数以及存储过程。 仅以SQL Server 2008为例,对标量值函数以及存储过程的流程进行说明(标量值函数以及存储过程当中的代码不在这里讲述) 标量值函数 ...
  • had_meno
  • had_meno
  • 2016年12月12日 15:15
  • 1779

SQL 标量值函数的调用

调用 MS SQL 标量值函数,应该在函数前面加上 "dbo.",否则会报 “不是可以识别的 内置函数名称”错误。例如     DECLARE @WhichDB TINYINT;    SELECT ...
  • leftfist
  • leftfist
  • 2009年11月04日 10:23
  • 9436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sqlserver中的表值函数和标量值函数
举报原因:
原因补充:

(最多只允许输入30个字)