如何将用户定义的表类型传递给内联函数

时间:2016-09-13 13:51:28

标签: sql-server tsql table-valued-parameters inline-table-function

我想在一些查询中使用一些复杂的函数。它获取一些值列表并返回聚合值。

例如(我简化它,它在行动中更复杂):

CREATE FUNCTION Mean(@N Numbers READONLY)
RETURNS TABLE AS RETURN (
    SELECT mean = SUM(n.value) / COUNT(*) FROM @N n
)

我希望在查询中使用它:

SELECT d.DepartmentName, MeanRate = m.mean
FROM Departments d
CROSS APPLY Mean(
    (
        SELECT value = e.Rate
        FROM Employees e
        WHERE e.DepatmentId = d.DepatmentId
    )
) m

但是我收到一个错误:     操作数类型冲突:浮点数与数字

不兼容

我知道我可以使用游标或传递值作为XML,但我认为这种方式比内联函数和表变量慢。

如何将值列表传递给内联函数?

1 个答案:

答案 0 :(得分:1)

首先,您应该使用内联函数中使用的table typeNumber)创建表变量。

将所需的行插入表变量并传递表变量o Inline function

你需要做这样的事情

declare @Numbers Numbers

Insert into @Numbers 
select e.Rate
From Employees  E join 
Departments d on e.DepatmentId = d.DepatmentId

select * from Mean(@Numbers)

更新:根据您的评论

创建新的table type

CREATE TYPE Dept_number AS TABLE
(
DepatmentId  INT ,value numeric(22,6)
);

Alter函数

ALTER FUNCTION Mean(@dept_number DEPT_NUMBER readonly) 
returns TABLE 
AS 
    RETURN 
      (SELECT depatmentid, 
              mean = Sum(n.value) / Count(*) 
       FROM   @dept_number n 
       GROUP  BY depatmentid) 

调用函数

DECLARE @dept_number DEPT_NUMBER 

INSERT INTO @dept_number 
            (depatmentid, 
             value) 
SELECT d.depatmentid, 
       e.rate 
FROM   employees E 
       JOIN departments d 
         ON e.depatmentid = d.depatmentid 

SELECT * 
FROM   Mean(@dept_number)