TSQL - подсчитать определенные значения в UDF таблицы Multistatement и передать их в дополнительный столбец - PullRequest
1 голос
/ 01 мая 2011

во время кодирования моего проекта я столкнулся с препятствием и не могу решить эту проблему ...

вот что я хотел бы достичь, у меня есть простая таблица, в которой хранятся данные, связанные с футболистами, такими как: Число (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.

Я был бы очень благодарен залюбая подсказка, идея и т. д. Заранее спасибо!

Правда, я перейду на встроенный.Еще один вопрос, есть ли способ использовать столбец FuzzyLevel в предложении где?(Я получаю недопустимое имя столбца FuzzinessLevel). Я хочу ограничить допустимый уровень fuzzylevel.Я расширил обе функции еще одним дополнительным аргументом @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 Ответ

2 голосов
/ 01 мая 2011

Просто добавьте его как столбец, потому что 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 с несколькими операторами часто снижает производительность ...

...