这个存储过程怎么写?

nannanok 2008-04-07 04:55:11
建立一个存储过程级联来修改pubs数据库的authors、titleauthor两张表,当用户修改authors表中的au_id后,修改titleauthors表中对应的数据。
...全文
72 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
JL99000 2008-04-07
  • 打赏
  • 举报
回复
建立一个存储过程级联来修改pubs数据库的authors、titleauthor两张表,当用户修改authors表中的au_id后,修改titleauthors表中对应的数据。
---
没想到什么好的方法,就是在authors表上建立一个触发器(update),在触发器中用update('au_id')来判断该列是否进行了更新,从而采取相应的动作

ojuju10 2008-04-07
  • 打赏
  • 举报
回复

建立外键时,级联更新吧
sweetweiwei 2008-04-07
  • 打赏
  • 举报
回复
--如果authors和titleauthors有外键只需改变authors中的au_id,titleauthors对应字段也改变.
--如果没有外键try 一下
CREATE PROCEDURE chgauthors
@p_au_id INT
AS
SET NOCOUNT ON

DECLARE @l_Err INT,
@l_Msg NVARCHAR(4000),
@l_Id NVARCHAR(15),
@l_ProcName VARCHAR(30),
@l_ProcDB VARCHAR(30)

-- Initialize error handle-related constants
SET @l_Id = ''
SET @l_ProcName = OBJECT_NAME (@@PROCID)
SET @l_ProcDB = DB_NAME()

-- Business logic
BEGIN TRY

UPDATE authors
SET au_id = @p_au_id
WHERE 条件

UPDATE titleauthors
SET au_id = @p_au_id
WHERE 条件

END TRY

-- Exception handle
BEGIN CATCH

-- Rollback transaction if needed
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END

-- Log error message
SET @l_Msg = 'Number: ' + CONVERT(VARCHAR, ERROR_NUMBER()) + CHAR(10) +
'Line: ' + CONVERT(VARCHAR, ERROR_LINE()) + CHAR(10) +
'Severity: ' + CONVERT(VARCHAR, ERROR_SEVERITY()) + CHAR(10) +
'State: ' + CONVERT(VARCHAR, ERROR_STATE()) + CHAR(10) +
'Procedure: ' + ISNULL(ERROR_PROCEDURE(), '') + CHAR(10) +
'Message: ' + ERROR_MESSAGE()

SET @l_Err = ERROR_NUMBER()

-- Store error and raise error
EXECUTE sp_LogError @l_Err, @l_Msg, @l_Id, @l_ProcName, @l_ProcDB
RAISERROR(@l_Msg, 18, 1)
RETURN @l_Err

END CATCH

RETURN @@ERROR
-狙击手- 2008-04-07
  • 打赏
  • 举报
回复
你还可以使用级联更新
nannanok 2008-04-07
  • 打赏
  • 举报
回复
谢谢楼上的,要求不能用触发器,而是使用存储过程进行级联.
bqb 2008-04-07
  • 打赏
  • 举报
回复
触发器!
两张表数据同步 (添加、删除、修改 触发器)     

--建立环境

create table table1 (sno varchar(10),sname varchar(10))
create table table2 (sno varchar(10),sname varchar(10))

go

create trigger t_table1 on table1
after delete,insert,update
as
begin
delete from table2 where sno in (select sno from deleted)

if not exists (select 1 from table2 a,inserted i where a.sno=i.sno)
insert into table2
select * from inserted
else
update a set a.sname=i.sname from table2 a,inserted i where a.sno=i.sno
end

go


/**********插入记录************/

insert into table1
select '0001','aa' union all
select '0002','bb' union all
select '0004','dd'

select * from table1
select * from table2


--table1
/*
sno sname
----- -------
0001 aa
0002 bb
0004 dd


--table2
sno sname
------ -------
0001 aa
0002 bb
0004 dd
*/


/********删除记录*************/
delete from table1 where sno='0004'

select * from table1
select * from table2

--table1
/*
sno sname
----- -------
0001 aa
0002 bb

--table2
sno sname
------ -------
0001 aa
0002 bb
*/



/***********更新记录************/
update table1 set sname='cc' where sno='0002'

select * from table1
select * from table2

--table1
/*
sno sname
----- -------
0001 aa
0002 cc

--table2
sno sname
------ -------
0001 aa
0002 cc
*/


/********删除测试**********/

drop table table1,table2
wangxuelid 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 nannanok 的帖子:]
建立一个存储过程级联来修改pubs数据库的authors、titleauthor两张表,当用户修改authors表中的au_id后,修改titleauthors表中对应的数据。
[/Quote]
写触发器吧,

create trigger tri_dep_name
on authors
for update
as
begin
declare @DepName nvarchar(50),@newDepName nvarchar(50)
select @DepName=au_id from deleted
select @newDepName=au_id from inserted
update titleauthors set au_id=@newDepName where depName=@DepName
end

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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