SQL Server:按游标求和
这是SQL Server 2012函数,我希望它通过游标返回所有值,但这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(零): 更新:如果必须使用光标作为练习,则需要确保
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