আমি মানগুলির একটি অ্যারে সহ একটি টেবিল আপডেট করার চেষ্টা করছি। অ্যারেতে থাকা প্রতিটি আইটেমটিতে এসকিউএল সার্ভার ডাটাবেসের একটি সারণীতে একটি সারির সাথে মেলে এমন তথ্য রয়েছে। সারণীটি ইতিমধ্যে টেবিলটিতে উপস্থিত থাকলে, আমরা প্রদত্ত অ্যারেতে তথ্য সহ সেই সারিটি আপডেট করি। অন্যথায়, আমরা টেবিলে একটি নতুন সারি সন্নিবেশ করিয়েছি। আমি মূলত উপস্থাপক বর্ণনা করেছি।
এখন, আমি এটি একটি XML প্যারামিটার লাগে এমন একটি সঞ্চিত পদ্ধতিতে এটি অর্জনের চেষ্টা করছি am আমি এক্সএমএল ব্যবহার করছি এবং টেবিল-মূল্যবান প্যারাম নয় কারণ কারণ, পরে এসকিউএল এ আমাকে কাস্টম টাইপ তৈরি করতে হবে এবং এই প্রকারটি সঞ্চিত পদ্ধতির সাথে যুক্ত করতে হবে। আমি যদি কখনও আমার সঞ্চিত পদ্ধতিতে বা আমার ডিবি স্কিমার রাস্তায় কিছু পরিবর্তন করি তবে আমাকে সঞ্চিত পদ্ধতি এবং কাস্টম প্রকার উভয়ই আবার করতে হবে। আমি এই পরিস্থিতি এড়াতে চাই তদুপরি, এক্সপিএমের চেয়ে টিভিপির যে শ্রেষ্ঠত্ব রয়েছে তা আমার পরিস্থিতির জন্য কার্যকর নয় কারণ, আমার ডেটা অ্যারের আকার কখনই 1000 এর বেশি হবে না This এর অর্থ এখানে প্রস্তাবিত সমাধানটি আমি ব্যবহার করতে পারি না: এসকিউএল সার্ভার ২০০৮-এ এক্সএমএল ব্যবহার করে একাধিক রেকর্ড কীভাবে সন্নিবেশ করা যায়?
এছাড়াও, এখানে একটি অনুরূপ আলোচনা ( ইউপিএসইআরটি - এমইআরজিই বা @@ সার্কাউন্টের আরও ভাল বিকল্প আছে কি? ) আমি যা জিজ্ঞাসা করছি তার থেকে আলাদা কারণ, আমি একাধিক সারি একটি টেবিলের উপরে সরিয়ে দেওয়ার চেষ্টা করছি ।
আমি আশা করছিলাম যে এক্সএমএল থেকে মানগুলি সুনির্দিষ্ট করতে আমি কেবল নীচের প্রশ্নেরগুলি ব্যবহার করব। কিন্তু এটি কাজ করে না। যখন ইনপুটটি একক সারিতে থাকে তখন এই পদ্ধতির কাজ করার কথা।
begin tran
update table with (serializable) set select * from xml_param
where key = @key
if @@rowcount = 0
begin
insert table (key, ...) values (@key,..)
end
commit tran
পরবর্তী বিকল্প হ'ল উপস্থিত বা নিম্নরূপের এর কোনও একটির প্রকরণের উপস্থিতি সম্পূর্ণরূপে ব্যবহার করা। তবে, আমি এটিকে উপ-অনুকূল দক্ষতার ভিত্তিতে প্রত্যাখ্যান করছি:
IF (SELECT COUNT ... ) > 0
UPDATE
ELSE
INSERT
পরের বিকল্পটি এখানে বর্ণিত হিসাবে মার্জ বিবৃতিটি ব্যবহার করছে: http ://www.datediaj Journal.com/features/mssql/ using-the- खेळाडू-statement-to-perform-an-upsert.html । তবে, তারপরে আমি এখানে মার্জ কোয়েরি নিয়ে সমস্যাগুলি সম্পর্কে পড়লাম: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers- নিম- স্টেটমেন্ট / । এই কারণে, আমি মার্জটিকে এড়াতে চেষ্টা করছি।
সুতরাং, এখন আমার প্রশ্নটি হল: এসকিউএল সার্ভার ২০০ টি সঞ্চিত পদ্ধতিতে এক্সএমএল প্যারামিটার ব্যবহার করে একাধিক উপকরণ অর্জনের জন্য অন্য কোনও বিকল্প বা আরও ভাল উপায় আছে কি?
দয়া করে নোট করুন যে এক্সএমএল প্যারামিটারের ডেটাতে এমন কিছু রেকর্ড থাকতে পারে যা বর্তমান রেকর্ডের চেয়ে পুরনো হওয়ার কারণে ইউপিএসআরটিড হওয়া উচিত নয়। ModifiedDate
এক্সএমএল এবং গন্তব্য সারণী উভয় ক্ষেত্রেই একটি ক্ষেত্র রয়েছে যা রেকর্ডটি আপডেট করা উচিত বা বাতিল করা উচিত তা নির্ধারণের জন্য তুলনা করা দরকার।
MERGE
বার্ট্র্যান্ডের সাথে যে বিষয়গুলি উল্লেখ করা হয়েছে সেগুলি বেশিরভাগ প্রান্তের মামলা এবং অদক্ষতা, স্টপারকে দেখায় না - এমএস এটি বাস্তব মাইনফিল্ড না হলে মুক্তি দিত না। আপনি কি নিশ্চিত যে আপনি যে কনভলিউশনগুলি এড়াতে যাচ্ছেন MERGE
সেগুলি সংরক্ষণের চেয়ে বেশি সম্ভাব্য ত্রুটি তৈরি করছে না?
MERGE
। MERGE এর INSERT এবং আপডেটের পদক্ষেপগুলি এখনও আলাদাভাবে প্রক্রিয়াজাত করা হয়। আমার পদ্ধতির মূল পার্থক্যটি হ'ল টেবিলের পরিবর্তনশীল যা আপডেট হওয়া রেকর্ড আইডি এবং ডিলিট ক্যোয়ারি ধারণ করে যা সেই টেবিল ভেরিয়েবলটি ইনকামিং ডেটার টেম্প টেবিল থেকে সেই রেকর্ডগুলি সরাতে ব্যবহার করে। এবং আমি মনে করি যে টেম্প টেবিলের উপরে ফেলে দেওয়ার পরিবর্তে সোর্সটি @ এক্সএমএলপারাম.নোড () থেকে সরাসরি হতে পারে, তবে তবুও, এই প্রান্তের কোনও ক্ষেত্রে নিজেকে খুঁজে পাওয়ার বিষয়ে চিন্তা করার মতো অতিরিক্ত জিনিস নয়; - )।