首页 > 解决方案 > 子查询作为 SQL Server UDF 的参数

问题描述

我的问题与类似。

我做了一个标量函数,如下所示:

CREATE FUNCTION [dbo].[MyFunction](@table [TableModel] READONLY)
RETURNS DECIMAL(18, 6) AS
BEGIN
    DECLARE @sql NVARCHAR(MAX), @params NVARHCAR(MAX), @value DECIMAL(16, 8);
    SELECT @sql = formula, @params = params FROM formulas WHERE id = (SELECT TOP 1 id_formula FROM @table)
    EXEC sp_executesql @sql, @params, @table=@table, @value=@value OUTPUT;
    RETURN @value;
END

公式 SQL 可能类似于:

SELECT @value = SUM(value) / AVG(value) FROM @table

如果需要,它可以有更多的列。

模型表如下所示:

CREATE TYPE [dbo].[TableModel] AS TABLE(
    [formula] INT NOT NULL,
    [value] DECIMAL(16, 8) NOT NULL
)

我想像这样使用它:

SELECT  od.id, od.col1, od.col2, 
        dbo.MyFunction((SELECT id.formula, id.value FROM #raw_data id WHERE id.id = od.id)) as result
FROM    #data od
GROUP BY od.id, od.col1, od.col2

ID 唯一且多行将具有相同的 ID。

基本上,我在单个查询中尝试执行的操作是调用具有表参数的函数。但我希望这个表是一个子查询。

我知道您可以使用此答案中提到的表变量调用该函数。

这有可能吗?我在执行时遇到此错误:

Msg 116, Level 16, State 1, Line 30
当子查询没有用 EXISTS 引入时,只能在选择列表中指定一个表达式。

标签: sqlsql-serversubqueryuser-defined-functionstable-variable

解决方案


推荐阅读