我正在尝试创建一个存储过程,表明两种类型员工的加薪。高于平均工资和低于平均工资的人。 fnHeadCount和fnAverageSalary都是我创建的功能,它们在过去工作并且已经工作过。我在第二部分遇到错误。它表示等号和1.4075的语法不正确。
这是代码。我把错误粗体化了:
CREATE PROC RAISEA9
BEGIN
UPDATE tblEmployeeA9
SET AnnualSalary=ROUND(1.025*AnnualSalary,2)
SELECT dbo.fnHeadCount(JobTitle)
FROM dbo.tblEmployeeA9
WHERE Active='Y'
HAVING (dbo.fnHeadCount(JobTitle)-1 >=2) AND (AnnualSalary > dbo.fnAverageSalary(JobTitle))
END
BEGIN
SET AnnualSalary=ROUND(1.0475*AnnualSalary,2)
SELECT dbo.fnHeadCount(JobTitle)
FROM dbo.tblEmployeeA9
WHERE Active='Y'
HAVING (dbo.fnHeadCount(JobTitle)-1 >=2) AND (AnnualSalary <= dbo.fnAverageSalary(JobTitle))
END
答案 0 :(得分:2)
CREATE PROC RAISEA9
BEGIN
UPDATE tblEmployeeA9
SET AnnualSalary=ROUND(1.025*AnnualSalary,2)
-- SELECT HAS TO GO, otherwise Sql Server will update ALL records
--SELECT dbo.fnHeadCount(JobTitle)
--FROM dbo.tblEmployeeA9
WHERE Active='Y'
--THERE ARE NO aggregate functions, so HAVING is replaced with AND
--HAVING
and (dbo.fnHeadCount(JobTitle)-1 >=2)
AND (AnnualSalary > dbo.fnAverageSalary(JobTitle))
-- not yet time for END
-- END
-- And no need for BEGIN either
-- BEGIN
-- There is UPDATE statement needed
UPDATE tblEmployeeA9
SET AnnualSalary = ROUND (1.0475 * AnnualSalary,2)
-- Again select has no place in UPDATE statement
--SELECT dbo.fnHeadCount(JobTitle)
--FROM dbo.tblEmployeeA9
WHERE Active='Y'
-- And HAVING gives place to AND
--HAVING
AND (dbo.fnHeadCount(JobTitle)-1 >=2)
AND (AnnualSalary <= dbo.fnAverageSalary(JobTitle))
END
<强>更新强>
此外,虽然我们在同一页面上,当您努力缩小富人与非富人之间的差距时,请注意第一次更新将提高第二次更新的平均工资。只有操作的顺序(AnnualSalary&gt;,AnnualSalary&lt; =)才能使你免于给两个人加注。 这两个更新基本相同,可以轻松重写:
SET AnnualSalary = ROUND(AnnualSalary *
CASE WHEN AnnualSalary > dbo.fnAverageSalary(JobTitle)
THEN 1.025
ELSE 1.0475
END
,2)
当然, AND(AnnualSalary&lt; = dbo.fnAverageSalary(JobTitle))和AND(AnnualSalary&lt; = dbo.fnAverageSalary(JobTitle))将被删除。
答案 1 :(得分:1)
您似乎忘记了UPDATE tablename
...
答案 2 :(得分:1)
好像你错过了第二个块的UPDATE语句。
答案 3 :(得分:1)
除了@ Nicola的回答之外,您应该注意到您的过程执行了2个Update语句。取决于dbo.fnAverageSalary(JobTitle)
和dbo.fnHeadCount(JobTitle)
计算的方式和具体内容(计算中是否使用AnnualSalary
以及第一个更新语句所做的更改是否会影响计算第二次更新),您可能会有两个语句更新某些行,或者没有更新任何行。如果你想要这样的行为,那很好。如果没有,您应该尝试在一个Update语句中进行更改,如下所示:
CREATE PROC RAISEA9
BEGIN
UPDATE dbo.tblEmployeeA9
SET AnnualSalary
= CASE WHEN (AnnualSalary > dbo.fnAverageSalary(JobTitle))
THEN ROUND(1.025 * AnnualSalary, 2)
ELSE ROUND(1.0475 * AnnualSalary, 2)
END
WHERE Active='Y'
AND (dbo.fnHeadCount(JobTitle)-1 >=2)
END