অনেক লোক আপনাকে ব্যবহারের পরামর্শ দিবে MERGE
, তবে আমি আপনাকে এর বিরুদ্ধে সাবধান করছি। ডিফল্টরূপে, এটি আপনাকে একাধিক বিবৃতি ছাড়া সামঞ্জস্য এবং বর্ণের পরিস্থিতি থেকে রক্ষা করে না, তবে এটি অন্যান্য বিপদগুলিরও পরিচয় দেয়:
http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
এমনকি এই "সরল" সিনট্যাক্সটি উপলব্ধ থাকা সত্ত্বেও আমি এখনও এই পদ্ধতির পছন্দ করি (ব্রেভিটির জন্য বাদ দেওয়া ত্রুটি পরিচালনা করে):
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
UPDATE dbo.table SET ... WHERE PK = @PK;
IF @@ROWCOUNT = 0
BEGIN
INSERT dbo.table(PK, ...) SELECT @PK, ...;
END
COMMIT TRANSACTION;
অনেক লোক এইভাবে পরামর্শ দেবেন:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
IF EXISTS (SELECT 1 FROM dbo.table WHERE PK = @PK)
BEGIN
UPDATE ...
END
ELSE
INSERT ...
END
COMMIT TRANSACTION;
তবে এই সমস্ত সম্পাদনকারীরা নিশ্চিত করছে যে সারিটি আপডেট করার জন্য আপনাকে দুবার টেবিলটি পড়তে হবে। প্রথম নমুনায়, আপনাকে কেবল একবারই সারিটি সনাক্ত করতে হবে। (উভয় ক্ষেত্রেই, প্রাথমিক পাঠ থেকে কোনও সারি পাওয়া না গেলে, একটি সন্নিবেশ ঘটে occurs)
অন্যরা এইভাবে পরামর্শ দেবেন:
BEGIN TRY
INSERT ...
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 2627
UPDATE ...
END CATCH
যাইহোক, এটি যদি সমস্যা হয় তবে এসকিউএল সার্ভারকে ব্যতিক্রমগুলি ধরতে দেওয়া ছাড়া যদি আপনি প্রথমে প্রতিরোধ করতে পারেন তবে এটি ব্যয়বহুল দৃশ্য ব্যতীত, যেখানে প্রায় প্রতিটি সন্নিবেশ ব্যর্থ হয় except আমি এখানে যতটা প্রমাণ করি: