日期:2014-05-17  浏览次数:20468 次

两表关联更新的存储过程
表A 结构如下:

发送单位编号 接收单位编号 卡号 是否已接收 接收日期
-----------------------------
0005 0001 50001 未接收 NULL
0006 0001 50002 未接收 NULL
0007 0001 50003 未接收 NULL
0002 0003 60001 未接收 NULL
0001 0005 80001 未接收 NULL


表B 结构如下:

卡号 单位编号 是否已读  
---------------------------
50001 0005 已读
50002 0003 已读
50003 0008 已读
80001 0009 已读

问题:
如何用一存储过程以表A中"卡号"与表B中"卡号"相同的数据来更新表B中的"单位编号"(将表B中的"单位编号"更新为表A中的"接收单位编号"),同时更新表A中的"接收日期"为当前系统日期,"是否已接收"更新为已接收,并将表B中更新过数据的"是否已读"字段更新为"未读"

谢谢
   


------解决方案--------------------
不需要存储过程.

SQL code
update b
set  单位编号 = a.单位编号 , 
     是否已读 = '未读'
from b , a
where b.卡号 = a.卡号

update a
set 接收日期 = getdate()
from a , b
where a.卡号 = b.卡号

------解决方案--------------------
SQL code
SET NOCOUNT ON
IF OBJECT_ID('TA')IS NOT NULL DROP TABLE TA
GO
CREATE TABLE TA(发送单位编号 VARCHAR(10),接收单位编号 VARCHAR(10),卡号 VARCHAR(10),是否已接收 NVARCHAR(10),接收日期 DATETIME) 
----------------------------- 
INSERT TA SELECT '0005'    ,          '0001',      '50001'    ,  N'未接收',        NULL 
INSERT TA SELECT '0006'   ,           '0001' ,     '50002'   ,   N'未接收' ,       NULL 
INSERT TA SELECT '0007'  ,            '0001'  ,    '50003'  ,    N'未接收'  ,      NULL 
INSERT TA SELECT '0002' ,             '0003'   ,   '60001' ,     N'未接收'   ,     NULL 
INSERT TA SELECT '0001',              '0005'    ,  '80001',      N'未接收'    ,    NULL 
IF OBJECT_ID('TB')IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(卡号 VARCHAR(10),  单位编号 VARCHAR(10),  是否已读 NVARCHAR(10))  
--------------------------- 
INSERT TB SELECT 50001  ,'0005',      N'已读' 
INSERT TB SELECT 50002  ,'0003' ,     N'已读' 
INSERT TB SELECT 50003 , '0008'  ,    N'已读' 
INSERT TB SELECT 80001,  '0009'   ,   N'已读' 
IF OBJECT_ID('PROC_UPDTE')IS NOT NULL DROP PROC PROC_UPDTE
GO
CREATE PROC PROC_UPDTE
AS
DECLARE @ERR INT 
SET @ERR=0
BEGIN TRAN
UPDATE B SET 单位编号=A.接收单位编号,是否已读=N'未读' FROM TB B ,TA A WHERE B.卡号=A.卡号
SET @ERR=@ERR+@@ERROR
UPDATE A SET 接收日期=GETDATE(),是否已接收=N'已接收' FROM TB B ,TA A WHERE B.卡号=A.卡号
SET @ERR=@ERR+@@ERROR
IF @ERR=0
   COMMIT
ELSE
   ROLLBACK
GO
EXEC PROC_UPDTE
SELECT * FROM TA
SELECT * FROM TB
/*发送单位编号     接收单位编号     卡号         是否已接收      接收日期
---------- ---------- ---------- ---------- -----------------------
0005       0001       50001      已接收        2009-02-11 19:07:12.993
0006       0001       50002      已接收        2009-02-11 19:07:12.993
0007       0001       50003      已接收        2009-02-11 19:07:12.993
0002       0003       60001      未接收        NULL
0001       0005       80001      已接收        2009-02-11 19:07:12.993

卡号         单位编号       是否已读
---------- ---------- ----------
50001      0001       未读
50002      0001       未读
50003      0001       未读
80001      0005       未读

*/