Tsql 带循环的程序

Tsql 带循环的程序,tsql,Tsql,我想创建一个程序,为来自给定部门编号DEPTNO且工资低于DEPTNO avarage SAL的员工设置佣金COMM 我编写了以下程序: CREATE PROCEDURE test1 @deptno INT AS BEGIN DROP TABLE #emps DECLARE @avg INT SELECT @avg = AVG(SAL) FROM EMP WHERE DEPTNO = @deptno SELECT RowNum = ROW_NU

我想创建一个程序,为来自给定部门编号DEPTNO且工资低于DEPTNO avarage SAL的员工设置佣金COMM

我编写了以下程序:

CREATE PROCEDURE test1
    @deptno INT
AS
BEGIN
    DROP TABLE #emps
    DECLARE @avg INT
    SELECT @avg = AVG(SAL) FROM EMP WHERE DEPTNO = @deptno

    SELECT 
    RowNum = ROW_NUMBER() OVER(ORDER BY EMPNO)
    ,*
    INTO #emps
    FROM EMP

    DECLARE @MaxRownum INT
    SET @MaxRownum = (SELECT MAX(RowNum) FROM #emps)

    DECLARE @Iter INT
    SET @Iter = (SELECT MIN(RowNum) FROM #emps)

    WHILE @Iter <= @MaxRownum
    BEGIN
        SELECT *
        FROM #emps
        WHERE RowNum = @Iter

        SET COMM = SAL * 0,05 IF DEPTNO = @deptno AND SAL < @avg


        SET @Iter = @Iter + 1
    END
END

但它似乎在循环中失败了。我以前从未在SQL中使用过任何循环。我如何解决这个问题

这里真的不需要循环。通过实践,您将在SQL中实现从逐行思考到集合思考的飞跃

with cteDeptAvg AS (
    SELECT deptno, AVG(sal) as AverageSalary
        FROM emp
        GROUP BY deptno
)
UPDATE e
    SET comm = sal * 0.05
    FROM emp e
        INNER JOIN cteDeptAvg da
            ON e.deptno = da.deptno
    WHERE e.sal < da.AverageSalary
        AND e.deptno = @deptno;

这里真的不需要循环。通过实践,您将在SQL中实现从逐行思考到集合思考的飞跃

with cteDeptAvg AS (
    SELECT deptno, AVG(sal) as AverageSalary
        FROM emp
        GROUP BY deptno
)
UPDATE e
    SET comm = sal * 0.05
    FROM emp e
        INNER JOIN cteDeptAvg da
            ON e.deptno = da.deptno
    WHERE e.sal < da.AverageSalary
        AND e.deptno = @deptno;

怎么会失败?它是抛出了一个错误,还是没有输出预期的数据

首先,你有COMM=SAL*0,05,我假设它应该是0.05。这将修复错误,除非错误实际上不在代码中


通常,当您尝试在SQL中迭代结果集时,您希望使用游标:

如何失败?它是抛出了一个错误,还是没有输出预期的数据

首先,你有COMM=SAL*0,05,我假设它应该是0.05。这将修复错误,除非错误实际上不在代码中


通常,当您试图在SQL中迭代结果集时,您希望使用游标:

使用循环有什么原因吗?此外,您可能有语法错误。在设置COMM=SAL*后的0和05之间有一个逗号。一组示例数据会很有用。使用循环有什么原因吗?此外,您可能有语法错误。在设置COMM=SAL*后,0和05之间有一个逗号。一组示例数据可能会有所帮助。存在一个问题,以下查询正在对所有DEPTNO执行更新。我想创建一个过程,并在准确传递的DEPTNO上执行它。@Gregy我已经调整了答案。这正是我想要的结果。非常感谢。有一个问题,下面的查询正在对所有DEPTNO执行更新。我想创建一个过程,并在准确传递的DEPTNO上执行它。@Gregy我已经调整了答案。这正是我想要的结果。多谢各位。