Tsql 带循环的程序
我想创建一个程序,为来自给定部门编号DEPTNO且工资低于DEPTNO avarage SAL的员工设置佣金COMM 我编写了以下程序: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
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我已经调整了答案。这正是我想要的结果。多谢各位。