TSQL - 计算多语句表 UDF 中的特定值并将它们传递给附加列
Posted
技术标签:
【中文标题】TSQL - 计算多语句表 UDF 中的特定值并将它们传递给附加列【英文标题】:TSQL - Count specific values within Multistatement table UDF and pass them to additional column 【发布时间】:2011-05-01 19:18:55 【问题描述】:在我的项目编码过程中,我遇到了一个障碍,无法解决这个问题......
这就是我想要实现的目标,我有一个简单的表格来存储与足球运动员相关的数据,例如:号码 (ID)、姓名、目标(是额外的,但现在无关紧要),我创建了一个UDF 多语句表 LotOfGoals 如下所示:
CREATE FUNCTION LotOfGoals()
RETURNS @Players TABLE
(
Number INT,
Name VARCHAR(20),
Goals INT
FuzzyLevel FLOAT(3) --extra column which I would like to add to result
)
AS
BEGIN
INSERT @Players
SELECT Number, Name, Goals
FROM FuzzyFootballTeam
WHERE Goals > 2
ORDER BY Number
-- here FuzzyLevel column should include data counted by MembershipLevel
-- scalar UDF.
-- I want to pass each number of goals into MembershipLevel function and
-- insert return value into a new column FuzzyLevel.
RETURN
END
GO
现在 MembershipLevel 函数:
CREATE FUNCTION MembershipLevel(@Goals INT)
RETURNS float(3)
AS
BEGIN
DECLARE @Level float(3)
SET @Level = 0.25*@Goals - 0.5;
RETURN @Level
END
正如我所写,在 WHERE 子句之后,我想将每个目标数量传递给 MembershipLevel,然后将其返回值插入新列 FuzzyLevel。
如果有任何提示、想法等,我将不胜感激。 提前致谢!
没错,我会换成在线的。还有一个问题是有什么方法可以在 where 子句中使用 FuzzyLevel 列吗? (我收到无效的列名'FuzzinessLevel')我想要的是限制允许的模糊级别。我用一个额外的参数@AcceptedFuzzyLevel float 扩展了这两个函数,标量函数如下所示:
DECLARE @Level float(3)
DECLARE @TempLevel float(3)
IF (@Goals <= 2)
SET @TempLevel = 0;
IF (@TempLevel >= @FuzzyLevelAccepted)
SET @Level = @TempLevel;
ELSE IF (@Goals > 2 AND @Goals < 6)
SET @TempLevel = 0.25*@Goals - 0.5;
IF (@TempLevel >= @FuzzyLevelAccepted)
SET @Level = @TempLevel;
ELSE IF (@Goals >= 6)
SET @TempLevel = 1;
IF (@TempLevel >= @FuzzyLevelAccepted)
SET @Level = @TempLevel;
RETURN @Level
但在执行之后,我也会收到带有 NULL 值的记录。
好的,我已经解决了。刚刚解决了以下不等式:x > 4y + 2。有效,但我很好奇为什么不能在 Where 子句中使用新列。
谢谢一百万!
【问题讨论】:
【参考方案1】:只需将其添加为列,因为 MembershipLevel
是一个标量 udf。外部代码无关紧要(存储的 proc 或 tablek 值 udf 或 SELECT)
INSERT @Players (Number, Name, Goals, FuzzyLevel)
SELECT Number, Name, Goals,
dbo.MembershipLevel(Goals)
FROM FuzzyFootballTeam ft
WHERE Goals > 2
ORDER BY Number
观察:我会明确指定@Players 的列列表。我还会问自己为什么这不是一个内联表值函数:多语句 udf 通常是性能杀手...
【讨论】:
以上是关于TSQL - 计算多语句表 UDF 中的特定值并将它们传递给附加列的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历表的列名并将值传递给 MSSQL while 循环中的 UDF
如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?