SQL Server:按游标求和

SQL Server:按游标求和,sql,function,sql-server-2012,Sql,Function,Sql Server 2012,这是SQL Server 2012函数,我希望它通过游标返回所有值,但这SUM只返回基中的最后一条记录 当我想通过以下方式求和时: SET @AllSalary = @salarya + @AllSalary 它显示NULL 我不知道是什么问题,可能是语法错误,事实是它没有显示所需的结果 (param@montha INT,稍后将使用) 你到底为什么要使用光标 只需使用一个SUM,由于您看到NULL值,请使用ISNULL将NULL值转换为0(零): 更新:如果必须使用光标作为练习,则需要确保

这是SQL Server 2012函数,我希望它通过游标返回所有值,但这
SUM
只返回基中的最后一条记录

当我想通过以下方式求和时:

SET @AllSalary = @salarya + @AllSalary 
它显示NULL

我不知道是什么问题,可能是语法错误,事实是它没有显示所需的结果

param@montha INT
,稍后将使用)

你到底为什么要使用光标

只需使用一个
SUM
,由于您看到
NULL
值,请使用
ISNULL
NULL
值转换为0(零):

更新:如果必须使用光标作为练习,则需要确保

  • 正确地将
    @AllSalary
    的值初始化为
    0
    (否则它从一开始就是
    NULL
    ,并且将永远不会得到任何其他值!)

  • 在遍历最终会导致整个
    SUM
    NULL
    的行时,处理数据库表中的
    NULL
    值(通过使用
    将这些值从光标中排除,其中工资不为NULL
    或通过应用
    ISNULL(..)
    到要求和的值):

  • 代码应为:

    CREATE FUNCTION allCasR (@montha INT)
    RETURNS INT
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @AllSalary INT;
        DECLARE @salarya FLOAT;
        DECLARE @tymC FLOAT;
    
        -- Add the T-SQL statements to compute the return value here
        DECLARE kursor_pensja CURSOR FOR
            SELECT contracts.salary
            FROM dbo.contracts ;
    
        -- you need to INITIALIZE this value to 0 !!!!! 
        SET @AllSalary = 0;
    
        OPEN kursor_pensja;
        FETCH NEXT FROM kursor_pensja INTO @salarya
    
        WHILE @@FETCH_STATUS=0 
        BEGIN
            -- you need to make sure to use ISNULL(.., 0) to avoid a NULL value in the SUM
            SET @AllSalary += ISNULL(@salarya, 0);
    
            FETCH NEXT FROM kursor_pensja INTO @salarya
        END
    
        CLOSE kursor_pensja  
        DEALLOCATE kursor_pensja
    
        RETURN @AllSalary;
    END
    

    SET@AllSalary=+@salarya

    您的
    +
    符号在
    =
    之后是,这就是它不能按预期工作的原因

    应该是:

    CREATE FUNCTION allCasR (@montha INT)
    RETURNS INT
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @AllSalary INT;
        DECLARE @salarya FLOAT;
        DECLARE @tymC FLOAT;
    
        -- Add the T-SQL statements to compute the return value here
        DECLARE kursor_pensja CURSOR FOR
            SELECT contracts.salary
            FROM dbo.contracts ;
    
        -- you need to INITIALIZE this value to 0 !!!!! 
        SET @AllSalary = 0;
    
        OPEN kursor_pensja;
        FETCH NEXT FROM kursor_pensja INTO @salarya
    
        WHILE @@FETCH_STATUS=0 
        BEGIN
            -- you need to make sure to use ISNULL(.., 0) to avoid a NULL value in the SUM
            SET @AllSalary += ISNULL(@salarya, 0);
    
            FETCH NEXT FROM kursor_pensja INTO @salarya
        END
    
        CLOSE kursor_pensja  
        DEALLOCATE kursor_pensja
    
        RETURN @AllSalary;
    END
    
    SET@AllSalary+=@salarya

    编辑:

    “返回空值”

    如果它返回NULL,则表示您的某些值为
    NULL


    使用
    SELECT ISNULL(contracts.salary,0)
    而不是
    SELECT contracts.salary

    我知道通过SELECT更简单,那就是到学校,我必须使用游标。@user3314502:在这里使用游标完全没有意义。。。。。但好的,如果这是一个练习:为了避免
    NULL
    值,请使用
    SET@AllSalary=+ISNULL(@salarya,0)
    @salarya
    中的任何
    NULL
    值转换为
    0
    ,这样您就可以对它们求和,但这必须只显示如何使用光标@marc_s:这就是您在数据库最后一行中只写SUM的内容。@user3314502:不,它将对数据库中的所有值求和!
    CREATE FUNCTION allCasR (@montha INT)
    RETURNS INT
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @AllSalary INT;
        DECLARE @salarya FLOAT;
        DECLARE @tymC FLOAT;
    
        -- Add the T-SQL statements to compute the return value here
        DECLARE kursor_pensja CURSOR FOR
            SELECT contracts.salary
            FROM dbo.contracts ;
    
        -- you need to INITIALIZE this value to 0 !!!!! 
        SET @AllSalary = 0;
    
        OPEN kursor_pensja;
        FETCH NEXT FROM kursor_pensja INTO @salarya
    
        WHILE @@FETCH_STATUS=0 
        BEGIN
            -- you need to make sure to use ISNULL(.., 0) to avoid a NULL value in the SUM
            SET @AllSalary += ISNULL(@salarya, 0);
    
            FETCH NEXT FROM kursor_pensja INTO @salarya
        END
    
        CLOSE kursor_pensja  
        DEALLOCATE kursor_pensja
    
        RETURN @AllSalary;
    END