এসকিউএল সার্ভার 2005 মাইএসকিউএল পুনর্নির্মাণ বাস্তবায়ন?

মাইএসকিউএল এই অবিশ্বাস্যভাবে দরকারী এখনো উপযুক্ত হয় <�কোড> পরিবর্তন করুন </কোড> SQL কমান্ড।

এই সহজে SQL সার্ভার 2005 সালে অনুকরণ করা যাবে?

একটি নতুন লেনদেন শুরু করার মাধ্যমে, নির্বাচন করুন() এবং তারপর UPDATE বা INSERT এবং COMMIT সর্বদা সামান্য একটি ব্যথা বিট, বিশেষ করে যখন অ্যাপ্লিকেশন এটি করছেন এবং সেইজন্য সবসময় বিবৃতি 2 সংস্করণ পালন।

SQL সার্ভার ২005 এ এমন একটি ফাংশন বাস্তবায়ন করার সহজ এবং সার্বজনীন উপায় আছে কি না আমি ভাবছি?

0
যোগ সম্পাদিত
মতামত: 1

4 উত্তর

আপস / মার্জ করা হচ্ছে কি প্রভাব কিছু ...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT INTO [Table]

তাই আশা করি এই নিবন্ধগুলির সংমিশ্রণ এবং এই ছদ্ম কোডগুলি জিনিসগুলি সরিয়ে নিতে পারে।

0
যোগ

আপনি খুঁজছেন কার্যকারিতা ঐতিহ্যগতভাবে একটি UPSERT বলা হয়। আপনি যা খুঁজছেন তা খুঁজে বের করতে সর্বদা বুদ্ধিমান আপনি কি খুঁজছেন তা খুঁজে পেতে সাহায্য করতে পারে।

I don't think SQL Server 2005 has any great ways of doing this. 2008 introduces the MERGE statement that can be used to accomplish this as shown in: http://www.databasejournal.com/features/mssql/article.php/3739131 or http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

2005 এর বিটাতে মার্জটি পাওয়া যায়, কিন্তু তারা চূড়ান্ত রিলিজে তা সরিয়ে দিয়েছিল।

0
যোগ

আমি একটি এই সমস্যা সম্পর্কে ব্লগ পোস্ট লিখেছি।

নিচের লাইন হল আপনি যদি সস্তা আপডেট চান ... এবং আপনি সমকক্ষ ব্যবহারের জন্য নিরাপদ হতে চান। চেষ্টা করে দেখুন:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

এই ভাবে আপনি আপডেটের জন্য 1 টি অপারেশন এবং সন্নিবেশ করার জন্য সর্বাধিক 3 টি অপারেশন আছে। তাই, যদি আপনি এটি আপডেট করে থাকেন তবে এটি একটি নিরাপদ সস্তা বিকল্প।

আমি খুব সাম্প্রতিক ব্যবহারের জন্য অনিরাপদ যে কিছু ব্যবহার করা খুব সতর্কতা অবলম্বন করা হবে। প্রাথমিক কী লঙ্ঘন বা উৎপাদনে ডুপ্লিকেট সারি পেতে তার সত্যিই সহজ।

0
যোগ

এটি এমন কিছু বিষয় যা আমাকে MSSQL সম্পর্কে অবহিত করে ( আমার ব্লগ )। আমি MSSQL সমর্থিত আপস </কোড>।

@ ডিলি-ও এর কোড পুরোনো এসকিউএল সংস্করণ (+1 ভোট) একটি ভাল উপায়, কিন্তু এটি এখনও মূলত দুটি আইও অপারেশন ( বিদ্যমান এবং তারপর আপডেট </কোড> বা < কোড> সন্নিবেশ </কোড>)

মূলত: এই পোস্টে একটি সামান্য ভাল উপায় আছে:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

এটি একটি আইও অপারেশন এটি একটি আপডেট যদি, বা একটি সন্নিবেশ দুই যদি এটি হ্রাস।

মাইক্রোসফট এসকিএল ২008 এসকিউএল থেকে একত্রিতকরণ প্রবর্তন করে: 2003 স্ট্যান্ডার্ড:

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

এখন এটা শুধু একটি আইও অপারেশন, কিন্তু ভয়াবহ কোড :-(

0
যোগ
গ্রেট, ধন্যবাদ! নির্বাচনের সংরক্ষণ করে এবং প্রায়ই এমন পরিস্থিতিতে পরিস্থিতিতে একটি teransaction প্রয়োজন না যেখানে আমি নিশ্চিত যে আপডেট এবং "আমার" সন্নিবেশ মধ্যে, যে কি জন্য অন্য কোন সন্নিবেশ নেই
যোগ লেখক Michael Stum, উৎস
@ মিছেল আপনি এই সমাধানটি ব্যবহার করতে যাচ্ছেন তাহলে আপনি এই টেবিলে একটি অনন্য সূচক এবং ডুপ্লিকেট কী ত্রুটিগুলি পরিচালনা করছেন।
যোগ লেখক Sam Saffron, উৎস
হ্যাঁ, এখানে উল্লেখ করা হয়েছে: weblogs.sqlteam.com/dang/archive/2009/01/31/… মর্জি পারমাণবিক নয়। এটি একটি নিখুঁত আপডেট লক আউট লাগে, কিন্তু একটি সন্নিবেশ করার আগে এটি রিলিজ, যা একটি জাতি শর্ত যা প্রাথমিক কী লঙ্ঘন হতে পারে ফলে। পারমাণবিক অস্ত্রোপচারের জন্য আপনাকে অবশ্যই একটি আনুষঙ্গিক হোল্ডলক ব্যবহার করতে হবে যাতে আনুমানিক UPDLOCK ছাড়াও। যেহেতু এটি দাঁড়িয়েছে, এটি একটি একক বিবৃতি হতে সত্ত্বেও এটি পারমাণবিক নয়।
যোগ লেখক Triynko, উৎস
@ কেথ আপনার একত্রীকরণের বিবৃতি কাজ করে না। মরিজ </ কোড> WHERE ধারাটি সমর্থন করে না, আপনাকে কোডটি ব্যবহার করে USING এবং ON পুনঃনামকরণ করতে হবে। এছাড়াও, যদি আপনি সহ (হোল্ডলক) যোগ করেন, তবে একটি জাতি এবং সমকক্ষ <�কোড> INSERT গুলি কী ঘটতে পারে, তাদের মধ্যে একটি কী কী সংঘর্ষের কারণে ব্যর্থ হয়েছে।
যোগ লেখক Eugene Beresovsky, উৎস
MERGE সিনট্যাক্সটি ভুল এবং এটি একই লেখক থেকে আরও সাম্প্রতিক উত্তরটিতে সংশোধন করা হয়েছে: stackoverflow.com/a/243670/24472</ একটি>
যোগ লেখক Larry, উৎস
উপরোক্ত সন্নিবেশ, একটি আপডেট দ্বারা অনুসরণ এখনও ব্যর্থ হতে পারে। একটি অনন্য কী দিয়ে আপনি সন্নিবেশের উপর ডুপ্লিকেট কী ব্যতিক্রমগুলি পেতে পারেন। আমি আপনার আপডেট বিবৃতি যোগ সুপারিশ: (সিজিবল) SET সঙ্গে টেবিল আপডেট ...
যোগ লেখক Elan, উৎস