【发布时间】:2009-08-10 16:36:02
【问题描述】:
我需要从一个表中提取记录,将数据复制到第二个表中,然后更新第一个表中的记录以表明它们已成功复制。
我目前的 SP 代码是这样的:
SELECT TBL_ADDRESSBOOKADDRESSES.* FROM TBL_ADDRESSBOOKADDRESSES
INNER JOIN TBL_CAMPAIGNS
ON TBL_ADDRESSBOOKADDRESSES.adds_ABMId = TBL_CAMPAIGNS.campaign_AddressBook
WHERE TBL_CAMPAIGNS.campaign_Status = 1
现在执行上述操作后,我需要将此数据插入到名为 TBL_RECIPIENTS 的第二个表中。假设这些列在 TBL_ADDRESSBOOKADDRESSES 中被简单地命名为 col_1、col_2、col_3 .... col_5,并且在 TBL_RECIPIENTS 中也是如此。
执行此操作后,我需要更新 TBL_CAMPAIGNS.campaign_Status = 2 理想情况下,这应该只针对那些实际已更新的记录(以防脚本由于服务器崩溃等原因中途停止)
如果您需要任何澄清,请告诉我。
非常感谢!
我接受了下面给出的建议,并提出了下面的工作代码。我已经阅读了建议添加 try/catch 以确保在发生任何错误时回滚的教程。我的代码在这方面是否足够?
我们将不胜感激地接受任何建议。
谢谢。
CREATE PROCEDURE web.SERVER_create_email_recipients
AS
BEGIN TRY
--sets (n) campaigns ready for transfer of emails to mailing list
UPDATE TOP(1) TBL_CAMPAIGNS
SET TBL_CAMPAIGNS.campaign_Status = 1
WHERE TBL_CAMPAIGNS.campaign_Status = 0
--finds above marked campaigns, retreives addresses then copies them to TBL_CAMPAIGNRECIPIENTS ready for auto mailout
INSERT TBL_CAMPAIGNRECIPIENTS (recip_CampaignId, recip_Email, recip_Forename, recip_Surname, recip_adds_Key)
SELECT C.Campaign_AddressBook, ABA.adds_Email, ABA.adds_RecipientForename, ABA.adds_RecipientSurname, ABA.adds_Key
FROM TBL_ADDRESSBOOKADDRESSES ABA
JOIN TBL_CAMPAIGNS C ON ABA.adds_ABMId = C.campaign_AddressBook
WHERE C.campaign_Status = 1
--checks that above emails have been copied across and then sets the campaigns status accordingly
UPDATE C
SET C.campaign_Status = 2
From TBL_CAMPAIGNS C
JOIN TBL_ADDRESSBOOKADDRESSES aba
ON aba.adds_ABMId = C.campaign_AddressBook
JOIN TBL_CAMPAIGNRECIPIENTS r on aba.adds_Key = r.recip_adds_Key
WHERE C.campaign_Status = 1
END TRY
BEGIN CATCH
-- Whoops, there was an error
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
--throws out error to logs?
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
【问题讨论】:
-
您使用的是哪个数据库系统?一些 DBMS 支持非常好的非标准方式。
-
tbl_campaigns 与 tbl_recipients 有何关系?我需要通过 Tbl_AddressBookAddresses 加入吗?
-
SQL Server 2008 将具有专为这种情况设计的 MERGE 语句 - 可以让您简化很多事情
-
有人可以评论一下这个更新吗?
标签: sql sql-server sql-server-2005 tsql stored-procedures