আমি মুছে ফেলতে না পারলে প্রকৃতপক্ষে মুছে ফেলা ব্যতিরেকে কোনও মুছে ফেলা বাধা লঙ্ঘনের ক্ষেত্রে চালিত হবে কিনা তা আমি ভবিষ্যদ্বাণী করতে সক্ষম হতে চাই।
এটি করার জন্য আমার বিকল্পগুলি কী কী? মুছে ফেলার "শুকনো রান" করার কি কোনও সহজ উপায় আছে?
আমি মুছে ফেলতে না পারলে প্রকৃতপক্ষে মুছে ফেলা ব্যতিরেকে কোনও মুছে ফেলা বাধা লঙ্ঘনের ক্ষেত্রে চালিত হবে কিনা তা আমি ভবিষ্যদ্বাণী করতে সক্ষম হতে চাই।
এটি করার জন্য আমার বিকল্পগুলি কী কী? মুছে ফেলার "শুকনো রান" করার কি কোনও সহজ উপায় আছে?
উত্তর:
যদি আপনার লক্ষ্যটি হ'ল সমস্ত মুছে ফেলা কেবলমাত্র সেগুলি সফল হয় তবে কেন কেবল ট্রাই / ক্যাচ ব্যবহার করবেন না:
BEGIN TRANSACTION;
BEGIN TRY
DELETE #1;
DELETE #2;
DELETE #3;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
এক বা একাধিক ব্যর্থ হওয়া সত্ত্বেও যদি লক্ষ্যটি সমস্ত সফল মুছে ফেলা সফল হওয়ার অনুমতি দেয় তবে আপনি স্বতন্ত্র ট্রাই / ক্যাচ ব্যবহার করতে পারেন, যেমন
BEGIN TRY
DELETE #1;
END TRY
BEGIN CATCH
PRINT 1;
END CATCH
BEGIN TRY
DELETE #2;
END TRY
BEGIN CATCH
PRINT 1;
END CATCH
একটি বিকল্প হ'ল লেনদেন শুরু করা, আপনার মোছা চালানো এবং তারপরে সর্বদা রোলব্যাক করুন:
begin tran
delete Table1 where col1 = 1
-- Test whether it is there
select * from Table1 where col1 = 1
rollback tran
-- Confirm that it is still there
select * from Table1 where col1 = 1
আমি কিছু কোড দিয়ে অ্যারন বার্ট্র্যান্ডের সরবরাহিত সমাধানটি উন্নত করতে চাই, আপনি যদি কোনও টেবিলের কোনও উপাদান যুক্ত করার চেষ্টা করতে চান তবে ব্যর্থতা উপেক্ষা করতে ব্যতিক্রমগুলি পরিচালনা করতে বা প্রক্রিয়াটির ত্রুটিগুলি বন্ধ করে দিতে।
এটি একটি টেবিল থেকে রেকর্ড নির্বাচন করবে এবং তারপরে ব্যতিক্রম ছাড়াই সেগুলি মুছতে চেষ্টা করবে:
DECLARE @MaxErrors INT
SET @MaxErrors = 5; // Setting 0 will stop process after the first error!
SELECT
[Id]
, ROW_NUMBER() OVER (ORDER BY Id ASC) AS [Index]
INTO #DeletingItems
FROM myTable
DECLARE @Current INT, @Max INT, @Id INT, @TotErrors INT
SELECT
@Current = 1
, @TotErrors = 0
, @Max = MAX([Index])
FROM #DeletingTable
WHILE @Current <= @Max
BEGIN
SELECT
@Id = [Id]
FROM #DeletingItems
WHERE
[Index] = @Index;
BEGIN TRANSACTION;
BEGIN TRY
DELETE FROM myTable WHERE [Id] = @Id;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
SET @TotErrors = @TotErrors + 1;
IF @TotErrors > @MaxErrors
BREAK;
END CATCH
SET @Current = @Current + 1;
END