“语法附近不正确......”SQL存储过程

时间:2012-03-26 21:27:33

标签: sql sql-server stored-procedures

我正在尝试创建一个存储过程,表明两种类型员工的加薪。高于平均工资和低于平均工资的人。 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

4 个答案:

答案 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