sql - ঢোকানো সারি পরিচয় পেতে শ্রেষ্ঠ উপায়?




sql-server tsql (8)

সন্নিবেশিত সারি IDENTITY করার সেরা উপায় কি?

আমি @@IDENTITY এবং IDENT_CURRENT এবং SCOPE_IDENTITY সম্পর্কে জানি কিন্তু প্রত্যেকের সাথে SCOPE_IDENTITY IDENT_CURRENT এবং SCOPE_IDENTITY বুঝতে পারছি না।

কেউ পার্থক্য ব্যাখ্যা করুন এবং আমি প্রতিটি ব্যবহার করা উচিত যখন দয়া করে?


আপনার সন্নিবেশ বিবৃতি পরে আপনি এই যোগ করা প্রয়োজন। এবং তথ্য সন্নিবেশ করানো হচ্ছে এমন টেবিলের নাম সম্পর্কে নিশ্চিত হন। আপনার সন্নিবেশ বিবৃতিতে এখনই সারিটি প্রভাবিত হয়েছে এমন বর্তমান সারি নম্বর পাবেন।

IDENT_CURRENT('tableName')

আমি অন্য ছেলের মতোই একই কথা বলছি, তাই প্রত্যেকের সঠিক, আমি শুধু এটি আরো পরিষ্কার করার চেষ্টা করছি।

@@IDENTITY আপনার ক্লায়েন্টের ডাটাবেসের সাথে সংযুক্ত হওয়া সর্বশেষ জিনিসটির আইডি প্রদান করে।
বেশিরভাগ সময় এটি সূক্ষ্ম কাজ করে তবে কখনও কখনও ট্রিগারটি চলে যাবে এবং একটি নতুন সারি সন্নিবেশ করবে যা আপনি জানেন না এবং আপনি যা চান তা পরিবর্তে আপনি এই নতুন সারির আইডি পাবেন।

SCOPE_IDENTITY() এই সমস্যাটি সমাধান করে। আপনি ডাটাবেসটিতে পাঠানো এসকিউএল কোডটিতে সন্নিবেশকৃত শেষ জিনিসটির আইডিটি ফেরত দেন। যদি ট্রিগারগুলি যান এবং অতিরিক্ত সারি তৈরি হয়, তবে তারা ভুল মূল্য ফেরত দেবে না। হুররে

IDENT_CURRENT কোনও দ্বারা ঢোকানো হয়েছে এমন শেষ আইডি প্রদান করে। যদি অন্য কোনও অ্যাপ্লিকেশনটি অপ্রয়োজনীয় সময়ে অন্য সারি সন্নিবেশ করায়, তবে আপনি তার পরিবর্তে সেই সারির আইডি পাবেন।

আপনি যদি এটি নিরাপদ খেলতে চান তবে সর্বদা SCOPE_IDENTITY() ব্যবহার করুন। আপনি যদি @@IDENTITY সাথে আটকে থাকেন এবং কেউ পরে ট্রিগার যোগ করার সিদ্ধান্ত নেয় তবে আপনার সমস্ত কোড ভাঙ্গবে।


আমি বিশ্বাস করি যে ঢোকানো আইডি পুনরুদ্ধারের সবচেয়ে নিরাপদ এবং সবচেয়ে সঠিক পদ্ধতি আউটপুট ক্লোজ ব্যবহার করবে।

উদাহরণস্বরূপ (নিম্নলিখিত এমএসডিএন নিবন্ধ থেকে নেওয়া)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

একটি নতুন সন্নিবেশকৃত সারির পরিচয় পেতে সর্বোত্তম (পঠনযোগ্য: নিরাপদ) উপায়টি output ব্যবহার করে:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)

যোগ

SELECT CAST(scope_identity() AS int);

আপনার সন্নিবেশ sql বিবৃতি শেষে, তারপর

NewId = command.ExecuteScalar()

এটা পুনরুদ্ধার করা হবে।


MSDN

@@ আইডেন্টিটি, SCOPE_IDENTITY, এবং IDENT_CURRENT একই রকম ফাংশন যা তারা একটি টেবিলের আইডেন্টিটি কলামে ঢোকানো শেষ মান প্রদান করে।

@@ আইডেন্টিটি এবং SCOPE_IDENTITY বর্তমান সেশনে যে কোনও টেবিলে উত্পন্ন সর্বশেষ পরিচয় মানটি ফিরিয়ে দেবে। যাইহোক, SCOPE_IDENTITY শুধুমাত্র বর্তমান সুযোগের মধ্যে মান প্রদান করে; @@ আইডেন্টিটি একটি নির্দিষ্ট সুযোগ সীমিত নয়।

IDENT_CURRENT সুযোগ এবং অধিবেশন দ্বারা সীমাবদ্ধ নয়; এটি একটি নির্দিষ্ট টেবিল সীমাবদ্ধ। IDENT_CURRENT কোনও সেশনে এবং যেকোনো সুযোগে একটি নির্দিষ্ট সারণির জন্য উত্পন্ন পরিচয় মান প্রদান করে। আরো তথ্যের জন্য, IDENT_CURRENT দেখুন।

  • IDENT_CURRENT একটি ফাংশন যা একটি তর্ক হিসাবে একটি টেবিল লাগে।
  • MSDN আপনার টেবিলে ট্রিগার করার সময় বিভ্রান্তিকর ফলাফলটি ফেরত দিতে পারে
  • SCOPE_IDENTITY আপনার হিরো বেশিরভাগ সময়।

সর্বদা scope_identity () ব্যবহার করুন, অন্য কিছু করার প্রয়োজন নেই।


  • @@IDENTITY সমস্ত স্কোপে বর্তমান সেশনে যে কোনও টেবিলের জন্য তৈরি সর্বশেষ পরিচয় মান প্রদান করে। এটি স্কোপ জুড়ে আছে , আপনি এখানে সতর্কতা অবলম্বন করা প্রয়োজন । আপনি আপনার বর্তমান বিবৃতি পরিবর্তে একটি ট্রিগার থেকে একটি মান পেতে পারে।

  • SCOPE_IDENTITY() বর্তমান সেশনে এবং বর্তমান সুযোগের যে কোনও সারণির জন্য তৈরি সর্বশেষ পরিচয় মান প্রদান করে। সাধারণত আপনি কি ব্যবহার করতে চান

  • IDENT_CURRENT('tableName') কোনও সেশনে এবং কোনও ক্ষেত্রে কোনও নির্দিষ্ট টেবিলের জন্য উত্পন্ন শেষ পরিচয় মান প্রদান করে। এটি আপনাকে কোন টেবিলটি মানটি চান তা উল্লেখ করতে দেয়, যদি উপরের দুটিটি আপনার যা দরকার তা খুব কম না ( খুব বিরল )। এছাড়াও, @ গাই স্টারবাক উল্লেখ করেছেন, "আপনি যদি এমন একটি টেবিলের জন্য বর্তমান পরিচয় মূল্য পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন।"

  • INSERT বিবৃতির OUTPUT ধারাটি আপনাকে সেই বিবৃতির মাধ্যমে ঢোকানো প্রতিটি সারি অ্যাক্সেস করতে দেয়। যেহেতু এটি নির্দিষ্ট বিবৃতিতে scoped, এটি উপরের অন্যান্য ফাংশন চেয়ে আরো সহজতর। যাইহোক, এটি একটু বেশি শব্দের অর্থ (আপনাকে একটি টেবিল পরিবর্তনশীল / টেম্প টেবিলের মধ্যে সন্নিবেশ করাতে হবে এবং তারপরে সেটি জিজ্ঞাসা করতে হবে) এবং এটি এমন একটি ত্রুটির দৃশ্যকল্পতেও ফলাফল দেয় যেখানে বিবৃতিটি পিছিয়ে দেওয়া হয়। যে বলে, আপনার প্রশ্নের একটি সমান্তরাল নির্বাহ পরিকল্পনা ব্যবহার করে, এটি সনাক্তকরণ (সমান্তরাল বন্ধ বাঁক ছোট) জন্য একমাত্র নিশ্চিত পদ্ধতি । যাইহোক, এটি ট্রিগারগুলির আগে কার্যকর করা হয় এবং ট্রিগার-উত্পন্ন মানগুলি ফেরত দিতে ব্যবহার করা যাবে না।







tsql