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 的返回值?

将多个表中的多行用于具有标量 UDF 的持久计算列

如何使用标准查询或使用 UDF 标记一行并将其特定值存储在 Hive 中?

SQL Server用户定义的函数(UDF)使用详解

TSQL UDF 根据第一个函数参数的值返回具有不同列数的表