sql - 子查询作为 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 引入时,只能在选择列表中指定一个表达式。
解决方案
推荐阅读
- ruby-on-rails - 在哪里实例化rails中的类
- amazon-web-services - AWS Beanstalk 中的应用程序数据文件夹
- css - 使背景动画响应的问题
- django - 有没有办法在 DRF 中对新数据的每个 GET 请求重新加载 ViewSet?
- android - 显示非常大的文本块时的 RecyclerView 与 LinearLayout
- javascript - 如何在 vuejs+electron 中调用“导出默认”范围之外的方法?
- javascript - Discord.js RichEmbed 字段值“空”,甚至认为它们不是。消息更新
- excel - Excel Power Query - 通过比较两列来过滤行
- java - 当我有许多 SpringBootTest 类时,如何有效地使用嵌套配置类来注入依赖项
- c# - 在继续处理之前如何等待处理程序的响应?