为什么储存过程得不到我想要的结果?

ruby_matlab 2010-07-26 03:02:41
create table tb_user(
use_id int primary key,
use_name varchar(20) not null,
use_sex varchar(2) not null,
use_address varchar(50) not null
);

insert into tb_user values('1','陈小','女','广东省');
insert into tb_user values('2','钟天','男','四川省');
insert into tb_user values('3','李四','男','云南省');
insert into tb_user values('4','叶茂','男','广东省');
insert into tb_user values('5','吴名','男','黑龙江');


create table tb_score(
use_id int,
sco_subject varchar(20) not null,
sco_score smallint not null,
foreign key(use_id) references tb_user(use_id)
);

insert into tb_score values('1','数学','97');
insert into tb_score values('2','英语','97');
insert into tb_score values('3','物理','97');
insert into tb_score values('4','数学','97');
insert into tb_score values('5','英语','97');

/*********************/
/* 更新 */
/********************/

drop PROCEDURE pro_Update_values
CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score smallint,
@out_message nvarchar(50) output
AS
BEGIN TRAN A
BEGIN TRY
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
UPDATE tb_user SET use_name=@inp_use_name,use_sex=@inp_use_sex,use_address=@inp_use_address WHERE use_id=@inp_use_id
SET @out_message='更新成功'
END TRY
BEGIN CATCH
SET @out_message='更新失败'
END CATCH
IF @@ERROR<>0
ROLLBACK TRAN A
ELSE
COMMIT TRAN A
go

--数据库存在@use_id=1
declare @out_message nvarchar(50)
EXEC pro_Update_values 1,'张三','男','广东省','语文',97,@out_message output print @out_message
--输出的@out_message是:更新成功

--数据库不存在@use_id=10
declare @out_message nvarchar(50)
EXEC pro_Update_values 10,'李四','男','广东省','语文',97,@out_message output print @out_message
--输出的@out_message还是:更新成功?????????
...全文
92 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2010-07-26
  • 打赏
  • 举报
回复
CREATE TABLE tb_user
(
use_id INT PRIMARY KEY,
use_name VARCHAR(20) NOT NULL,
use_sex VARCHAR(2) NOT NULL,
use_address VARCHAR(50) NOT NULL
);

INSERT INTO tb_user VALUES( '1', '陈小', '女', '广东省' );
INSERT INTO tb_user VALUES( '2', '钟天', '男', '四川省' );
INSERT INTO tb_user VALUES( '3', '李四', '男', '云南省' );
INSERT INTO tb_user VALUES( '4', '叶茂', '男', '广东省' );
INSERT INTO tb_user VALUES( '5', '吴名', '男', '黑龙江' );


CREATE TABLE tb_score
(
use_id INT,
sco_subject VARCHAR(20) NOT NULL,
sco_score SMALLINT NOT NULL,
FOREIGN KEY(use_id) REFERENCES tb_user(use_id)
);

INSERT INTO tb_score VALUES( '1', '数学', '97' );
INSERT INTO tb_score VALUES( '2', '英语', '97' );
INSERT INTO tb_score VALUES( '3', '物理', '97' );
INSERT INTO tb_score VALUES( '4', '数学', '97' );
INSERT INTO tb_score VALUES( '5', '英语', '97' );


/*********************/
/* 更新 */
/********************/
IF OBJECT_ID('pro_Update_values')>0
DROP PROCEDURE pro_Update_values
GO
CREATE PROCEDURE pro_Update_values
@inp_use_id INT,
@inp_use_name NVARCHAR(20),
@inp_use_sex NVARCHAR(2),
@inp_use_address NVARCHAR(50),
@inp_sco_subject NVARCHAR(20),
@inp_sco_score SMALLINT,
@out_message NVARCHAR(50) OUTPUT
AS
BEGIN TRAN A
BEGIN TRY
UPDATE tb_score
SET sco_subject = @inp_sco_subject, sco_score = @inp_sco_score
WHERE use_id = @inp_use_id
SET @out_message= 'tb_score表更新'+CASE WHEN @@ROWCOUNT>0 THEN '成功' ELSE '失败' END+char(13)
UPDATE tb_user
SET use_name = @inp_use_name, use_sex = @inp_use_sex, use_address = @inp_use_address
WHERE use_id = @inp_use_id
SET @out_message = @out_message+ 'tb_user表更新'+CASE WHEN @@ROWCOUNT>0 THEN '成功' ELSE '失败' END
END TRY
BEGIN CATCH
SET @out_message = '更新失败'
ROLLBACK TRAN A
END CATCH
COMMIT TRAN A
GO

--数据库存在@use_id=1
DECLARE @out_message NVARCHAR(50)
EXEC pro_Update_values 1, '张三', '男', '广东省', '语文', 97, @out_message OUTPUT
PRINT @out_message
/*
tb_score表更新成功
tb_user表更新成功
*/

--数据库不存在@use_id=10
DECLARE @out_message NVARCHAR(50)
EXEC pro_Update_values 10, '李四', '男', '广东省', '语文', 97, @out_message OUTPUT
PRINT @out_message
/*
tb_score表更新失败
tb_user表更新失败
*/
ruby_matlab 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 orchidcat 的回复:]

引用 4 楼 xys_777 的回复:

SQL code

CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarc……
[/Quote]
4楼和你的问答中,如果sql里面的类型(如@inp_sco_score是整型,我给他一个字符型'a'的话)不匹配,捕捉不到自己定义的异常。
declare @out_message nvarchar(50)
EXEC pro_Update_values 1,'张三','男','广东省','语文','a',@out_message output print @out_message

出现
消息 8114,级别 16,状态 1,过程 pro_Update_values,第 0 行
从数据类型 varchar 转换为 smallint 时出错。
Mr_Nice 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xys_777 的回复:]

SQL code

CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score small……
[/Quote]

永生哥这个清楚。
仅处理代码的话,参考!


CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score smallint,
@out_message nvarchar(50) output
AS
BEGIN TRAN A
BEGIN TRY
IF EXISTS(SELECT 1 FROM tb_score WHERE use_id=@inp_use_id )
begin
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
UPDATE tb_user SET use_name=@inp_use_name,use_sex=@inp_use_sex,use_address=@inp_use_address WHERE use_id=@inp_use_id
SET @out_message='更新成功'
end
ELSE
begin
SET @out_message='更新失败'
end
END TRY

BEGIN CATCH
SET @out_message='更新失败'
END CATCH

IF @@ERROR<>0
ROLLBACK TRAN A
ELSE
COMMIT TRAN A
go
ruby_matlab 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xys_777 的回复:]

SQL code

CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score small……
[/Quote]
为什么有时候会出现定义一个事务的时候,提示A附近有语法错误?
永生天地 2010-07-26
  • 打赏
  • 举报
回复

CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score smallint,
@out_message nvarchar(50) output
AS
set @out_message=''
BEGIN TRAN A
BEGIN TRY
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
if @@rowcount=0
set @out_message='tb_score表,数据不存在!'+char(10)
UPDATE tb_user SET use_name=@inp_use_name,use_sex=@inp_use_sex,use_address=@inp_use_address WHERE use_id=@inp_use_id
if @@rowcount=0
set @out_message=@out_message+'tb_user表,数据不存在'
END TRY
BEGIN CATCH
SET @out_message='更新失败'
END CATCH
IF @@ERROR<>0
ROLLBACK TRAN A
ELSE
if @out_message='' SET @out_message='更新成功'
COMMIT TRAN A
go
ruby_matlab 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 orchidcat 的回复:]

SQL code
BEGIN TRY
IF EXISTS(SELECT 1 FROM tb_score WHERE use_id=@inp_use_id )
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
……
[/Quote]

CREATE PROCEDURE pro_Update_values
@inp_use_id int,
@inp_use_name nvarchar(20),
@inp_use_sex nvarchar(2),
@inp_use_address nvarchar(50),
@inp_sco_subject nvarchar(20),
@inp_sco_score smallint,
@out_message nvarchar(50) output
AS
BEGIN TRAN A
BEGIN TRY
IF EXISTS(SELECT 1 FROM tb_score WHERE use_id=@inp_use_id )
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
UPDATE tb_user SET use_name=@inp_use_name,use_sex=@inp_use_sex,use_address=@inp_use_address WHERE use_id=@inp_use_id
SET @out_message='更新成功'
ELSE
SET @out_message='更新失败'
END TRY
IF @@ERROR<>0
ROLLBACK TRAN A
ELSE
COMMIT TRAN A
go


消息 156,级别 15,状态 1,过程 pro_Update_values,第 17 行
关键字 'ELSE' 附近有语法错误。
消息 156,级别 15,状态 1,过程 pro_Update_values,第 20 行
关键字 'IF' 附近有语法错误。
消息 102,级别 15,状态 1,过程 pro_Update_values,第 23 行
'A' 附近有语法错误。
claro 2010-07-26
  • 打赏
  • 举报
回复
。。。
Mr_Nice 2010-07-26
  • 打赏
  • 举报
回复
BEGIN TRY
IF EXISTS(SELECT 1 FROM tb_score WHERE use_id=@inp_use_id )
UPDATE tb_score SET sco_subject=@inp_sco_subject,sco_score=@inp_sco_score WHERE use_id=@inp_use_id
UPDATE tb_user SET use_name=@inp_use_name,use_sex=@inp_use_sex,use_address=@inp_use_address WHERE use_id=@inp_use_id
SET @out_message='更新成功'
ELSE
SET @out_message='更新失败'
END TRY


修改下看看

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧