开发者

TSQL - Count specific values within Multistatement table UDF and pass them to additional column

during coding my project I have encountered an obstacle and cannot go through with this issue...

here is what I would like to achieve, I have a simple table which stores data connected with football players like: Number (ID), Name, Goals (are additional ones, but right now are irrelevant) and I have created a UDF Multistatement table LotOfGoals which looks as follows:

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

now MembershipLevel function:

CREATE FUNCTION MembershipLevel(@Goals INT)
RETURNS float(3)
AS
BEGIN
    DECLARE @Level float(3)

    SET @Level = 0.25*@Goals - 0.5;

    RETURN @Level
END

As I have written, after WHERE clause I would like to pass each number of goals to a MembershipLevel and then its return value insert into new column FuzzyLevel.

I would be really really grateful for any hint, idea etc. Thanks in advance !

True, I will change to in-line one. One more question is there any way to use FuzzyLevel column in where clause ? (I receive Invalid column name 'FuzzinessLevel') what I want is to limit allowed fuzzylevel. I have expanded both functions with one more additional argument @AcceptedFuzzyLevel float and the scalar function looks like this:

DECLARE @Level float(3)开发者_如何学JAVA
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 

But after execution I also receive records with NULL values.

OK, I have fixed it. Just resolved following inequality: x > 4y + 2. Works but I`m curious why it is not possible to use new column in Where clause.

Thanks a million !


Just add it as a column because MembershipLevel is a scalar udf. It doesn't matter about the outer code (stored proc or tablek valued udf or SELECT)

INSERT    @Players (Number, Name, Goals, FuzzyLevel)
SELECT   Number, Name, Goals,

    dbo.MembershipLevel(Goals)

FROM     FuzzyFootballTeam ft
WHERE    Goals > 2 
ORDER BY Number

Observations: I'd explicitly specify the column list for @Players. I'd also ask myself why this isn't an in-line table valued function: a multi-statement udf is often a performance killer...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜