【问题标题】:SQL Server stored procedure error (staff pay rise)SQL Server 存储过程错误(员工加薪)
【发布时间】:2015-03-29 19:23:02
【问题描述】:

我正在尝试做一个存储过程,我正在给员工加薪,但我似乎不明白我做错了什么,它给了我以下错误

消息 8115,第 16 级,状态 8,程序 ClerkPayRise,第 8 行
将数值转换为数值数据类型时出现算术溢出错误。

我的存储过程的代码是:

CREATE PROCEDURE ClerkPayRise (@clerkID      VARCHAR (50),
                               @clerkPayrate DECIMAL(3, 2))
AS
BEGIN
   UPDATE clerks
   SET clerkPayrate = clerkPayrate + @clerkPayrate
   WHERE clerkID = @clerkID

   IF @@ROWCOUNT = 1
        SELECT 'The Hourly Pay Rise for Clerk: ' + (SELECT clerkFName + ' ' + clerkSName
                                                    FROM   clerks
                                                    WHERE  clerkID = @clerkID) + 'Was Successful'
   ELSE
        SELECT ' The Increase in Hourely Pay rate Failed, No Clerk with ID ;   ' + CAST(@clerkID AS VARCHAR (50))
END

EXECUTE ClerkPayRise
  clerk01,
  0.25
GO

DROP PROCEDURE ClerkPayRise 

我使用的样本数据如下:

CREATE TABLE clerks
(
     clerkID      VARCHAR (20) NOT NULL,
     clerkFName   VARCHAR (20),
     clerkSName   VARCHAR (20),
     clerkPayrate DECIMAL(3, 2),
     PRIMARY KEY (clerkID),
);

INSERT INTO clerks
VALUES ('clerk01' ,'Alex','Richards',7.49);

INSERT INTO clerks
VALUES ('clerk02', 'Jason','Elliot',8.25);

INSERT INTO clerks
VALUES ('clerk03', 'Mark','Alleyne',8.25);

INSERT INTO clerks
VALUES ('clerk04', 'Ricky','Ponting',8.00);

INSERT INTO clerks
VALUES ('clerk05', 'Nick','Lamb',8.75);

我将不胜感激任何指导和帮助

【问题讨论】:

  • 为我工作(一旦我在clerks 表中添加“角色”列)并返回“文员每小时加薪:亚历克斯理查兹成功”。您是否将某人增加到9.99以上?
  • 您的插入语句具有比列更多的值。请修复该问题。您的解决方案也可以正常工作。尽管您可以在此处找到有关您的错误的更多详细信息:sql-server-helper.com/error-messages/…
  • 嗨,马丁,我已经编辑了表格并插入了语句,请看一下,我只想给员工加薪 0.25 美分,只希望更新职员工资率列

标签: sql-server sql-server-2008 stored-procedures sql-server-2012


【解决方案1】:

你犯了一些错误,比如

  1. CREATE TABLE 文员 ( 职员ID varchar (20) NOT NULL, clerkFName varchar (20), clerkSName varchar (20), clerkPayrate decimal(3,2), 主键(职员 ID), );

在此查询中,“PRIMARY KEY (clerkID)”之后不应有任何逗号“,”。

  1. 您正在连续分配五个值,但您的表只有四列。

INSERT INTO clerks VALUES('clerk01','Mgr1', 'Alex', 'Richards',7.49); 这个查询是错误的。它分配了五个值而不是四个

如果存储过程有任何问题,请进行更正,以便我可以帮助您。

【讨论】:

  • CREATE TABLE 中允许使用尾随逗号,但 DECLARE .. TABLE - relevant connect item 中不允许使用逗号
  • 感谢 Utlesh,我已经编辑了表格和插入语句现在看看,我只是想更新职员工资率列,所以通过提供职员 ID 和增长率的输入参数,我只是想更新员工的工资率,例如,如果 Alex Richards 获得 7.49 美元,他将获得 0.25 美分的增加!希望有意义
  • 如果您发布代码、XML 或数据示例,PLEASE 在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( { } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
【解决方案2】:

在存储过程主体和存储过程执行语句之后缺少GO 批处理终止符。这会导致EXEC 语句成为存储过程的一部分,因此存储过程然后递归调用自身,直到发生算术溢出。

CREATE PROCEDURE ClerkPayRise (@clerkID      VARCHAR (50),
                               @clerkPayrate DECIMAL(3, 2))
AS
BEGIN
   UPDATE clerks
   SET clerkPayrate = clerkPayrate + @clerkPayrate
   WHERE clerkID = @clerkID

   IF @@ROWCOUNT = 1
        SELECT 'The Hourly Pay Rise for Clerk: ' + (SELECT clerkFName + ' ' + clerkSName
                                                    FROM   clerks
                                                    WHERE  clerkID = @clerkID) + 'Was Successful'
   ELSE
        SELECT ' The Increase in Hourely Pay rate Failed, No Clerk with ID ;   ' + CAST(@clerkID AS VARCHAR (50))
END
GO --need this terminator

EXECUTE ClerkPayRise
  'clerk01', --also enclose string literals in single quotes
  0.25
GO

【讨论】:

  • 已被另一位编辑删除。 OP最初发布的代码在exec之前有一个drop proc(这根本没有意义),我想会导致错误而不是递归调用stackoverflow.com/revisions/29333710/1
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 2018-10-04
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2011-08-10
相关资源
最近更新 更多