我想插入到使用select,但我知道有些行可能會失敗(這是預期的)。有沒有辦法更改SQL Server 2008的隱式事務,以便沒有失敗的事件不會回滾?關閉隱式事務
-- get the count of the customers to send the sms to
SELECT @count = COUNT(*)
FROM PreCampaignCustomer
WHERE Processed = 0 AND CampaignID = @campaignid
AND ErrorCount < 5
WHILE (@count > 0)
BEGIN
DECLARE @customerid INT,
@carrierid INT,
@merchantcustomerid INT,
@smsnumber NVARCHAR(50),
@couponcode NVARCHAR(20)
SELECT TOP 1 @customerid = pcc.CustomerID, @merchantcustomerid = pcc.MerchantCustomerID,
@carrierid = c.CarrierID, @smsnumber = c.SMSNumber
FROM PreCampaignCustomer pcc
INNER JOIN Customer c ON c.ID = pcc.CustomerID
WHERE pcc.Processed = 0 AND pcc.CampaignID = @campaignid
AND pcc.ErrorCount < 5
ORDER BY pcc.ErrorCount
--set the couponcode
IF @couponlength = -1
BEGIN
SET @couponcode = 'NOCOUPON'
END
ELSE
BEGIN
EXEC [GenerateCouponCode]
@length = 9,
@couponcode = @couponcode OUTPUT
END
BEGIN TRY
--use try/catch just in case the coupon code is repeated or any other error
--Set the coupon text
DECLARE @coupontext NVARCHAR(200),
@smsrequestxml XML
IF @coupontypecode = 1 --NONE
BEGIN
SET @coupontext = @merchantname + ': ' + @smsmessage + ', Use Code: ' + dbo.FormatCouponCode(@couponcode, @couponcodegrouping) + '. Reply STOP to quit'
END
ELSE
BEGIN
SET @coupontext = @merchantname + ': ' + @smsmessage + '. Reply STOP to quit'
END
EXEC GetSMSRequest @config = @smsconfig,
@smsType = 1, --Submit
@address = @smsnumber,
@carrierID = @carrierid,
@message = @coupontext,
@xml = @smsrequestxml OUTPUT
BEGIN TRAN
--create the CampaignCustomer record
INSERT INTO CampaignCustomer
(CampaignID, CustomerID, CouponCode, Active)
VALUES
(@campaignid, @customerid, @couponcode, 1)
--Add the record to the queue
INSERT INTO SMSQueue
(CarrierID, [Address], [Message], TimeToSend, RequestXML, QueueID, HTTPStatusCode, Retries)
VALUES
(@carrierid, @smsnumber, @coupontext, @timetosend, @smsrequestxml, @queueid, 0, 0)
--Create Outgoing SMS Log
INSERT INTO SMSOutgoingLog
(MerchantID, MerchantGroupID, MessageTypeCode, CreatedDate, Active)
VALUES
(@merchantid, @merchantgroupid, @messagetypecode, GETDATE(), 1)
--Update the LastSentSMSTime of the MerchantCustomer
UPDATE MerchantCustomer
SET LastSentSMS = GETDATE(),
ModifiedDate = GETDATE()
WHERE ID = @merchantcustomerid
UPDATE PreCampaignCustomer
SET Processed = 1,
ModifiedDate = GETDATE()
WHERE CustomerID = @customerid
AND CampaignID = @campaignid
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
-- Set the error
UPDATE PreCampaignCustomer
SET ErrorCount = ErrorCount + 1,
ModifiedDate = GETDATE(),
ErrorMessage = ERROR_MESSAGE(),
ErrorNumber = ERROR_NUMBER()
WHERE CustomerID = @customerid
AND CampaignID = @campaignid
END CATCH
SELECT @count = COUNT(*)
FROM PreCampaignCustomer
WHERE Processed = 0 AND CampaignID = @campaignid
AND ErrorCount < 5
END
我爲每一行生成一個隨機優惠券代碼,並且對優惠券代碼有一個唯一的約束。而不是做一個select來查看它是否存在我讓SQL Server處理約束並讓它失敗。您認爲使用該優惠券代碼檢查計數(*)會更快嗎? – 2010-10-26 14:33:16
你循環,每次迭代一次插入?如果是的話發佈代碼,以便我可以看到究竟發生了什麼。有辦法生成一組隨機數字:http://stackoverflow.com/questions/183124/multiple-random-values-in-sql-server-2005/183183#183183。 COUNT(*)也很慢(它工作更多),而不僅僅是一個普通的EXISTS。 – 2010-10-26 14:42:21
是的,我正在循環。我添加了代碼。底線我需要使這個查詢儘可能高效。也許不是每次迭代都要計數,只需執行select top 1,然後WHILE NOT @customerid爲null。還有其他建議嗎? – 2010-10-26 15:10:26