Функция SQL Server всегда возвращает NULL - PullRequest
0 голосов
/ 13 декабря 2011

Я тяну свои волосы сюда.Функция ниже всегда возвращает ноль, даже если она работает нормально, если я вытаскиваю код в окно запроса и устанавливаю входные параметры вручную.Идея состоит в том, что у меня другой запрос, основанный на месяце, потому что среднее значение каждого месяца хранится в другом столбце.Я знаю, что таблица не очень хорошо нормализована, но это то, с чем мне приходится работать.Чего мне не хватает?

ALTER FUNCTION [dbo].[fn_currentShareBal]
(
@currentDate    datetime,
@account        integer,
@acctType       varchar
)  
RETURNS money AS  
BEGIN

DECLARE @dte char(10)
DECLARE @returnVal money
DECLARE @month int

SET @dte = CONVERT(char(10), @currentDate, 101)
SET @month = MONTH(@currentDate)

-- because of the table strucure the actual query depends on the month
IF @month = 1 SET @returnVal = (SELECT SUM(avg1)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 2 SET @returnVal = (SELECT SUM(avg2)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 3 SET @returnVal = (SELECT SUM(avg3)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 4 SET @returnVal = (SELECT SUM(avg4)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 5 SET @returnVal = (SELECT SUM(avg5)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 6 SET @returnVal = (SELECT SUM(avg6)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 7 SET @returnVal = (SELECT SUM(avg7)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 8 SET @returnVal = (SELECT SUM(avg8)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 9 SET @returnVal = (SELECT SUM(avg9)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 10 SET @returnVal = (SELECT SUM(avg10)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 11 SET @returnVal = (SELECT SUM(avg11)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

IF @month = 12 SET @returnVal = (SELECT SUM(avg12)
                        FROM COSHAVG
                        WHERE cuID = @account
                        AND avgBalanceMonth =  @dte
                        AND acctType = @acctType)

RETURN @returnVal

END
GO

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Другие отметили, что нужно искать в комментариях, но вот более чистый способ переписать функцию (без реальных изменений в поведении, просто проще в обслуживании):

ALTER FUNCTION [dbo].[fn_currentShareBal]
    (
      @currentDate DATETIME
    , @account INTEGER
    , @acctType VARCHAR (100) 
    )
RETURNS MONEY
AS 
    BEGIN
        DECLARE @dte CHAR(10)
        DECLARE @returnVal MONEY
        DECLARE @month INT
        SET @dte = CONVERT(CHAR(10), @currentDate, 101)
        SET @month = MONTH(@currentDate) 
         -- because of the table strucure the actual query depends on the month 

        SELECT  @returnVal = SUM(CASE WHEN @month = 1 THEN avg1
                                      WHEN @month = 2 THEN avg2
                                    /*...*/
                                      WHEN @month = 12 THEN avg12
                                 END)
        FROM    COSHAVG
        WHERE   cuID = @account
                AND avgBalanceMonth = @dte
                AND acctType = @acctType


        RETURN @returnVal
    END 
1 голос
/ 13 декабря 2011

Я думаю, проблема в определении вашей функции. Трудно сказать, так как вы не опубликовали определение своей таблицы.

Это работает? Если нет, можете ли вы опубликовать сценарий Create в таблице COSHAVG?

ALTER FUNCTION [dbo].[fn_currentShareBal]
(
    @currentDate    datetime,
    @account        integer,
    @acctType       varchar(50)
)  
RETURNS money
AS  
BEGIN
    DECLARE @dte varchar(20)
    DECLARE @returnVal money
    DECLARE @month int

    SET @dte = CONVERT(varchar, @currentDate, 101)
    SET @month = MONTH(@currentDate)

    SELECT
        @returnVal=SUM(CASE
            WHEN @month = 1 THEN avg1
            WHEN @month = 2 THEN avg2
            WHEN @month = 3 THEN avg3
            WHEN @month = 4 THEN avg4
            WHEN @month = 5 THEN avg5
            WHEN @month = 6 THEN avg6
            WHEN @month = 7 THEN avg7
            WHEN @month = 8 THEN avg8
            WHEN @month = 9 THEN avg9
            WHEN @month = 10 THEN avg10
            WHEN @month = 11 THEN avg11
            WHEN @month = 12 THEN avg12
        END)
    FROM COSHAVG
    WHERE cuID = @account
    AND avgBalanceMonth =  @dte
    AND acctType = @acctType

    RETURN @returnVal
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...