我想在一些查询中使用一些复杂的函数。它获取一些值列表并返回聚合值。
例如(我简化它,它在行动中更复杂):
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,但我认为这种方式比内联函数和表变量慢。
如何将值列表传递给内联函数?
答案 0 :(得分:1)
首先,您应该使用内联函数中使用的table type
(Number
)创建表变量。
将所需的行插入表变量并传递表变量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)