Sertedোকানো সারির পরিচয় পাওয়ার সর্বোত্তম উপায়?


1118

IDENTITYSertedোকানো সারিটি পাওয়ার সর্বোত্তম উপায় কী ?

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

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


5
INSERT INTO Table1(fields...) OUTPUT INSERTED.id VALUES (...), বা পুরানো পদ্ধতি: INSERT INTO Table1(fields...) VALUES (...); SELECT SCOPE_IDENTITY();আপনি এটি এক্স # এক্সিউটসকালার () ব্যবহার করে সি # তে পেতে পারেন।
এস.স্পার্পোশন

4
অন্যান্য উত্তরগুলির চেয়ে এটি কীভাবে ভাল? (এছাড়াও - আপনি কেন কোনও মন্তব্যের পরিবর্তে উত্তর হিসাবে পোস্ট করছেন না)। দয়া করে একটি সম্পূর্ণ উত্তর লিখুন (এবং পোস্ট হওয়াগুলির তুলনায় এটি কেন সর্বোত্তম বিকল্প - ব্যাখ্যা করুন যদি সংস্করণটি নির্দিষ্ট থাকে তবে তাই বলুন)।
ওডে

এটি একটি সংক্ষিপ্তসার হিসাবে ঠিক। ; ডি গৃহীত উত্তরে OUTPUT ক্লজ সিনট্যাক্সের উল্লেখ নেই এবং নমুনার অভাব রয়েছে। অন্যান্য পোস্টে নমুনা তাই পরিষ্কার নও ...
S.Serpooshan

2
@ সাeedদসারপুজান - তারপরে এটিকে সম্পাদনা করুন that আপনি এটি করতে পারেন, জানেন? দেখুন যে উত্তর পোস্ট করা হয়েছে কখন? এটি OUTPUTএসকিউএল সার্ভারে ক্লজটির পূর্বাভাস দেয় ।
ওডে

উত্তর:


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

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

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

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


48
SCOPE_IDENTITY () সহ ভুল মানগুলি ফিরিয়ে আনার সাথে পরিচিত ত্রুটি: ব্লগ.সক্লোরটিটিটি / 2009 / 03 / 24/… আশেপাশের কাজটি মাল্টি প্রসেসর সমান্তরাল পরিকল্পনায় INSERT চালাবেন না বা OUTPUT ধারা
কেএম

3
প্রায় প্রতিবারই আমি 'পরিচয়' চেয়েছি, আমি সবেমাত্র .োকানো রেকর্ড (গুলি) এর কী (গুলি) জানতে চেয়েছি। যদি এটি আপনার পরিস্থিতি হয় তবে আপনি OUTPUT ধারাটি ব্যবহার করতে চান। আপনি যদি অন্য কিছু চান, তবে bdukes প্রতিক্রিয়া পড়ার এবং বুঝতে চেষ্টা প্রয়োগ করুন।
জেরি

3
আপনার সাথে outputফলাফলগুলি সংরক্ষণ এবং জিজ্ঞাসা করার জন্য একটি টেম্প টেবিল তৈরি করার দরকার নেই। intoআউটপুট ক্লজের অংশটি ছেড়ে দিন এবং এটি তাদের ফলাফলসীমে আউটপুট করবে।
spb

96
অন্যকে প্যানিশিং থেকে বাঁচানোর জন্য, উপরে উল্লিখিত বাগটি এসকিউএল সার্ভার ২০০৮ আর 2 সার্ভিস প্যাকের জন্য
সংশ্লেষিত

1
@ নিনিকো, আমি মনে করি যে সুপারিশটি যেমন হয়েছে ঠিক তেমনই, যা এতক্ষণে OUTPUT"সেরা" যেহেতু আপনি ট্রিগার ব্যবহার করছেন না এবং ত্রুটিগুলি পরিচালনা করছেন, তবে SCOPE_IDENTITYএটি সবচেয়ে সহজ এবং খুব কমই সমস্যা রয়েছে
বিডুউক

180

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

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

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

3
হ্যাঁ, এটি এগিয়ে যাওয়ার সঠিক পদ্ধতি, আপনি এসকিউএল সার্ভার ২০০৮ এ না থাকলে কেবল অন্যদের মধ্যে একটি ব্যবহার করুন (আমরা ২০০
sk এড়িয়ে গিয়েছি

1
@ এইচএলজিএম এসকিউএল সার্ভার ২০০৫-এর জন্যOUTPUT একটি এমএসডিএন পৃষ্ঠা রয়েছে , সুতরাং দেখে মনে হচ্ছে এটি কেবল এসকিউএল সার্ভার 2000 এবং এর আগে যেগুলি ব্যতীত নেই
বিডুকস

6
সাব্বাস! ক্লাস্ট শিলা আউটপুট :) এটি আমার বর্তমান কাজটি সহজ করে দেবে। এই বিবৃতি আগে জানতাম না। তোমাদেরকে ধন্যবাদ!
সুইস কোডার


আপনার OUTPUT এর সাথে INTO ব্যবহার করা ভাল ধারণা। দেখুন: blogs.msdn.microsoft.com/sqlprogrammability/2008/07/11/... (ক মন্তব্য এখানে থেকে: stackoverflow.com/questions/7917695/... )
shlgug

112

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

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

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

IDENT_CURRENTযে কারও দ্বারা inোকানো হয়েছে সর্বশেষ আইডি ফেরত দেয়। যদি অপ্রত্যাশিত সময়ে অন্য কোনও সারণি anotherোকানোর জন্য অন্য কোনও অ্যাপ্লিকেশনটি ঘটে থাকে, তবে আপনি আপনার সারির পরিবর্তে সেই সারির আইডি পাবেন get

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


64

সদ্য সন্নিবেশ করা সারিটির পরিচয় পাওয়ার সর্বোত্তম (পড়ুন: নিরাপদ) উপায়টি ক্লজটি ব্যবহার করে 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)

5
এসকিউএল সার্ভার ক্লাস্টারিং একটি উচ্চ প্রাপ্যতা বৈশিষ্ট্য এবং সমান্তরালে তার কোনও প্রভাব নেই। scope_identity()যে কোনও উপায়ে সমান্তরাল পরিকল্পনা পাওয়া একক সারি সন্নিবেশগুলির জন্য (সবচেয়ে সাধারণ ক্ষেত্রে ) এটি খুব অস্বাভাবিক । এবং এই বাগ এই উত্তরটির এক বছরেরও বেশি আগে স্থির হয়েছিল।
মার্টিন স্মিথ

সমান্তরালতা বলতে কী বোঝ?
user1451111

@ মার্টিনস্মিথ ক্লায়েন্ট তাদের সার্ভার ক্লাস্টারে এই সমস্যা সমাধানের বিষয়টি সিইউ ইনস্টল করার জন্য মজা করতে রাজি ছিল না (রসিকতা নয়), তাই কেবলমাত্র এসকিউএলকে outputপরিবর্তে ব্যবহার করার জন্য আমাদের পুনরায় লেখার একমাত্র সমাধান ছিল scope_identity()। আমি উত্তরে ক্লাস্টারিংয়ের বিষয়ে FUD সরিয়েছি।
ইয়ান কেম্প

1
আপনাকে ধন্যবাদ, এটি কেবলমাত্র আমি খুঁজে পেতে সক্ষম হয়েছি যা দেখায় যে কীভাবে আউটপুট থেকে মানটিকে কেবল আউটপুট না করে পরিবর্তনের মাধ্যমে কীভাবে ব্যবহার করতে হয়।
শন রায়

26

যোগ

SELECT CAST(scope_identity() AS int);

আপনার সন্নিবেশ করা এসকিএল স্টেটমেন্টের শেষে, তারপর

NewId = command.ExecuteScalar()

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


18

আপনি যখন সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করেন, এটি অভ্যন্তরীণভাবে OUTPUTসদ্য প্রবেশ করানো আইডি মানটি ফেরত দেওয়ার জন্য কৌশলটি ব্যবহার করে

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

আউটপুট ফলাফলগুলি একটি অস্থায়ী টেবিল ভেরিয়েবলে সংরক্ষণ করা হয়, টেবিলের সাথে ফিরে যোগদান করে এবং সারণির বাইরে সারি মান প্রদান করে।

দ্রষ্টব্য: কেন ইএফ অভ্যন্তরীণ ছক টেবিলের সাথে আসল টেবিলে ফিরে আসবে (কোন পরিস্থিতিতে দু'জন মিলে না।

তবে ইএফ এটি করে।

এই কৌশলটি ( OUTPUT) কেবলমাত্র এসকিউএল সার্ভার ২০০৮ বা আরও নতুনতে উপলব্ধ।

সম্পাদনা - যোগদানের কারণ

সারণি ফ্রেমওয়ার্ক মূল OUTPUTমানগুলি ব্যবহার না করে মূল টেবিলের সাথে ফিরে আসার কারণ EF rowversionএকটি নতুন সন্নিবেশ করা সারিটি পেতে এই কৌশলটিও ব্যবহার করে ।

বৈশিষ্ট্য: using ব্যবহার করেTimestamp আপনি আপনার সত্তা ফ্রেমওয়ার্ক মডেলগুলিতে আশাবাদী সম্মতি ব্যবহার করতে পারেন 🕗

public class TurboEncabulator
{
   public String StatorSlots)

   [Timestamp]
   public byte[] RowVersion { get; set; }
}

আপনি যখন এটি করেন, সত্তা ফ্রেমওয়ার্ক rowversionসদ্য সন্নিবেশ করা সারিটির প্রয়োজন হবে :

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID], t.[RowVersion]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

এবং এটি পুনরুদ্ধার করার জন্য Timetsampআপনি একটি ধারা ব্যবহার করতে পারবেন নাOUTPUT

কারণ টেবিলে যদি ট্রিগার থাকে তবে আপনার যে কোনও Timestampআউটপুট ভুল হবে:

  • প্রাথমিক সন্নিবেশ। টাইমস্ট্যাম্প: 1
  • আউটপুট ক্লজ আউটপুট টাইমস্ট্যাম্প: 1
  • ট্রিগার সারি পরিবর্তন করে। টাইমস্ট্যাম্প: 2

টেবিলে ট্রিগার থাকলে ফিরে আসা টাইমস্ট্যাম্পটি কখনই সঠিক হবে না । সুতরাং আপনাকে অবশ্যই আলাদা ব্যবহার করতে হবেSELECT

এমনকি যদি আপনি ভুল রোভার্সনটি ভোগ করতে ইচ্ছুক থাকেন তবে আলাদা করার অন্য কারণ SELECTহ'ল আপনি rowversionটেবিলের পরিবর্তনশীলটিকে আউটআপ করতে পারবেন না :

DECLARE @generated_keys table([Id] uniqueidentifier, [Rowversion] timestamp)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID, inserted.Rowversion INTO @generated_keys
VALUES('Malleable logarithmic casing');

এটি করার তৃতীয় কারণটি প্রতিসাম্যতা। UPDATEট্রিগার সহ কোনও টেবিলে কোনও অনুষ্ঠান করার সময় আপনি একটি ধারা ব্যবহার করতে পারবেন নাOUTPUT । Do চেষ্টা UPDATEএকটি সঙ্গে OUTPUTসমর্থিত নয়, এবং একটি ত্রুটি দিতে হবে:

এটি করার একমাত্র উপায় হ'ল ফলোআপ SELECTবিবৃতি দিয়ে:

UPDATE TurboEncabulators
SET StatorSlots = 'Lotus-O deltoid type'
WHERE ((TurboEncabulatorID = 1) AND (RowVersion = 792))

SELECT RowVersion
FROM TurboEncabulators
WHERE @@ROWCOUNT > 0 AND TurboEncabulatorID = 1

2
আমি ধারণা করি তারা নিখুঁততা নিশ্চিত করার জন্য তাদের সাথে মেলে (যেমন আশাবাদী সমঝোতা মোডে আপনি যখন টেবিলের পরিবর্তনশীলটি নির্বাচন করছেন, কেউ সন্নিবেশকারী সারিগুলি সরিয়ে ফেলেছেন)। এছাড়াও, আপনার TurboEncabulators:)
zaitsman

16

দুটিই MSDN

@@ পরিচয়, SCOPE_IDENTITY, এবং IDENT_CURRENT একই ধরণের ফাংশন যা তারা একটি সারণীর আইডেন্টিটি কলামে সন্নিবেশিত শেষ মানটি ফেরত দেয়।

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

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

  • IDENT_CURRENT একটি ফাংশন যা একটি টেবিলটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে।
  • টেবিলে আপনার ট্রিগার থাকলে @@ আইডেন্টিটি বিভ্রান্তিকর ফলাফল ফিরে আসতে পারে
  • SCOPE_IDENTITY হ'ল বেশিরভাগ সময় আপনার নায়ক।

14

বর্তমানের এসকিউএল সংযোগটি ব্যবহার করে IDোকানো শেষ পরিচয় হল @@ পরিচয়। সন্নিবেশ করা সঞ্চিত প্রক্রিয়া থেকে ফিরে আসা এটি একটি ভাল মান, যেখানে আপনার নতুন রেকর্ডের জন্য সবেমাত্র পরিচয় needোকানো দরকার এবং পরে আরও সারি যুক্ত করা হয়েছে কিনা সেদিকে খেয়াল রাখবেন না।

বর্তমান এসকিউএল সংযোগ ব্যবহার করে Sোকানো শেষ পরিচয় হ'ল SCOPE_IDENTITY , এবং বর্তমান স্কোপ - অর্থাৎ, যদি আপনার সন্নিবেশের পরে যদি একটি ট্রিগারের উপর ভিত্তি করে কোনও দ্বিতীয় পরিচয় সন্নিবেশ করা হয় তবে এটি SCOPE_IDENTITY এ প্রতিফলিত হবে না, কেবলমাত্র আপনি যে সন্নিবেশ সম্পাদন করেছেন । সত্যই, আমার এটি ব্যবহার করার কারণ ছিল না।

IDENT_CURRENT (টেবিলের নাম) সংযোগ বা সুযোগ নির্বিশেষে identity োকানো শেষ পরিচয়। আপনি যদি এমন কোনও টেবিলের জন্য বর্তমান পরিচয় মান পেতে চান যা আপনি কোনও রেকর্ড প্রবেশ করান নি।


2
এই উদ্দেশ্যে আপনার কখনই @@ পরিচয় ব্যবহার করা উচিত নয়। যদি কেউ পরে ট্রিগার যোগ করে তবে আপনি ডেটা অখণ্ডতা হারাবেন। @@ শনাক্তকরণ একটি অত্যন্ত বিপজ্জনক অনুশীলন।
এইচএলজিইএম

1
"আপনি যে টেবিলটির <<নোট>> এতে একটি রেকর্ড .োকালেন তার মান" " সত্যি?
আব্দুল সবুর

13

আমি এসকিউএল সার্ভারের অন্যান্য সংস্করণগুলির সাথে কথা বলতে পারি না, তবে ২০১২ সালে আউটপুটটিং সরাসরি ঠিক কাজ করে। অস্থায়ী টেবিল নিয়ে আপনাকে বিরক্ত করার দরকার নেই।

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

যাইহোক, একাধিক সারি সন্নিবেশ করার সময় এই কৌশলটিও কাজ করে।

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

আউটপুট

ID
2
3
4

আপনি যদি এটি পরে ব্যবহার করতে চান তবে আমি কল্পনা করি আপনার টেম্প টেবিলটি দরকার
ওসবার্ন

@ জনসোবার্ন আপনি পছন্দ করেন এমন একটি টেম্প টেবিল ব্যবহার করতে আপনাকে স্বাগত জানায় তবে আমার বক্তব্যটি এটির প্রয়োজনীয়তা নয় OUTPUT। আপনার যদি টেম্প টেবিলের প্রয়োজন না হয়, তবে আপনার ক্যোয়ারীটি অনেক সরল হয়ে শেষ হবে।
মাররেডচিজ

10

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


13
একেবারে নয় তবে 100 এর মধ্যে 99 বার, আপনি Scope_Identity () ব্যবহার করবেন।
সিজেএম

আপনি কি আর কখনও কিছু ব্যবহার করেছেন?
এরিক্ক্যালেন

11
আপনি যদি একটি INSERT-SELECT দিয়ে বেশ কয়েকটি সারি সন্নিবেশ করান, আপনাকে OUTPUT ধারা
কেএম

1
@ কেএম: হ্যাঁ, তবে আমি স্কোপ_সিডেন্টি বনাম @@ পরিচয় বনাম পরিচয়_কন্টেন্ট উল্লেখ করেছি। OUTPUT সম্পূর্ণ ভিন্ন শ্রেণি এবং প্রায়শই দরকারী।
এরিক্ক্যালেন

2
অ্যারির ( স্ট্যাকওভারফ্লো.com/ a/ 6073578 / 2440976 ) এই প্রশ্নের উত্তর দেখুন - সমান্তরালতাতে, এবং ঠিক একটি সেরা অনুশীলন হিসাবে, আপনি তার সেটআপটি অনুসরণ করা বুদ্ধিমান হবেন ... কেবল উজ্জ্বল!
ড্যান বি 21

2

একটি তৈরি করুন uuidএবং এটি একটি কলামে sertোকান। তারপরে আপনি সহজেই ইউউইড দিয়ে আপনার সারিটি সনাক্ত করতে পারবেন। আপনি প্রয়োগ করতে পারেন একমাত্র 100% কার্যক্ষম সমাধান Tha অন্যান্য সমস্ত সমাধান খুব জটিল বা একই ধরণের ক্ষেত্রে কাজ করছে না। উদাহরণ:

1) সারি তৈরি করুন

INSERT INTO table (uuid, name, street, zip) 
        VALUES ('2f802845-447b-4caa-8783-2086a0a8d437', 'Peter', 'Mainstreet 7', '88888');

2) সারি তৈরি করা

SELECT * FROM table WHERE uuid='2f802845-447b-4caa-8783-2086a0a8d437';

uuidডাটাবেসে ইনডেক্স তৈরি করতে ভুলবেন না Don't সুতরাং সারিটি দ্রুত পাওয়া যাবে।
ফ্রাঙ্ক রথ

Node.js জন্য আপনি কেবল একটি UUID তৈরি করতে এই মডিউল ব্যবহার করতে পারেন: https://www.npmjs.com/package/uuidconst uuidv4 = require('uuid/v4'); const uuid = uuidv4()
ফ্রাঙ্ক রথ

একটি গিউডি একটি পরিচয় মান নয়, এটি একটি সাধারণ পূর্ণসংখ্যার তুলনায় কিছু ব্যাকড্র থাকে।
আলেজান্দ্রো

1

সন্নিবেশ করা সারিগুলির পরিচয়ের গ্যারান্টি দেওয়ার আরেকটি উপায় হ'ল পরিচয় মানগুলি নির্দিষ্ট করে SET IDENTITY_INSERT ONএবং তারপরে ব্যবহার করুন OFF। এটি আপনাকে পরিচয়ের মানগুলি ঠিক কী তা জানার গ্যারান্টি দেয়! যতক্ষণ মানগুলি ব্যবহার না করা হয় ততক্ষণ আপনি এই মানগুলি পরিচয় কলামে সন্নিবেশ করতে পারেন।

CREATE TABLE #foo 
  ( 
     fooid   INT IDENTITY NOT NULL, 
     fooname VARCHAR(20) 
  ) 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

SET IDENTITY_INSERT #foo ON 

INSERT INTO #foo 
            (fooid, 
             fooname) 
VALUES      (1, 
             'one'), 
            (2, 
             'Two') 

SET IDENTITY_INSERT #foo OFF 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

INSERT INTO #foo 
            (fooname) 
VALUES      ('Three') 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

-- YOU CAN INSERT  
SET IDENTITY_INSERT #foo ON 

INSERT INTO #foo 
            (fooid, 
             fooname) 
VALUES      (10, 
             'Ten'), 
            (11, 
             'Eleven') 

SET IDENTITY_INSERT #foo OFF 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

SELECT * 
FROM   #foo 

আপনি যদি অন্য উত্স থেকে ডেটা লোড করছেন বা দুটি ডাটাবেস থেকে ডেটা মার্জ করে থাকেন তবে এটি খুব কার্যকর কৌশল হতে পারে


0

যদিও এটি একটি পুরানো থ্রেড, এটি করার আরও একটি নতুন উপায় রয়েছে যা এসকিউএল সার্ভারের পুরানো সংস্করণগুলিতে আইডেন্টিটি কলামের কিছু ক্ষতিগুলি এড়িয়ে চলে, যেমন সার্ভার পুনরায় চালু হওয়ার পরে পরিচয়ের মানগুলির ফাঁক । সিক্যুয়েন্সগুলি এসকিউএল সার্ভার ২০১ in-তে উপলব্ধ এবং এগিয়ে যা নতুন উপায়টি হল টিএসকিউএল ব্যবহার করে একটি সিকিউএনসি আইটেম তৈরি করা। এটি আপনাকে এসকিউএল সার্ভারে আপনার নিজস্ব সংখ্যাসূচক ক্রম অবজেক্ট তৈরি করতে এবং এটি কীভাবে বাড়বে তা নিয়ন্ত্রণ করতে দেয়।

এখানে একটি উদাহরণ:

CREATE SEQUENCE CountBy1  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

তারপরে টিএসকিউএলে আপনি পরবর্তী সিকোয়েন্স আইডি পেতে নিম্নলিখিতগুলি করবেন:

SELECT NEXT VALUE FOR CountBy1 AS SequenceID
GO

ক্রিয়েট সিকোয়েন্স এবং নেক্সট ভ্যালু ফর এর লিঙ্কগুলি এখানে


সিকোয়েন্সগুলির শনাক্তকরণগুলির মতো একই সমস্যা রয়েছে, যেমন ফাঁকগুলি (যা আসলে সমস্যা নয়)।
আলেজান্দ্রো

-1

আপনার sertোকানোর বিবৃতি দেওয়ার পরে আপনার এটি যুক্ত করা দরকার। এবং সারণীর নাম যেখানে ডেটা .োকানো হচ্ছে সে সম্পর্কে নিশ্চিত হয়ে নিন sert আপনার সন্নিবেশ বিবৃতি দিয়ে সারিটি এখনই সারিটি প্রভাবিত করে এমন কোনও বর্তমান সারি পাবেন।

IDENT_CURRENT('tableName')

2
আপনি কি লক্ষ্য করেছেন যে ঠিক এই একই পরামর্শটির আগে বেশ কয়েকবার উত্তর দেওয়া হয়েছে?
টিটি।

হ্যাঁ. তবে আমি সমাধানটি নিজের উপায়ে বর্ণনা করার চেষ্টা করছি।
খান আতাউর রহমান

এবং যদি অন্য কেউ আপনার সন্নিবেশ বিবৃতি এবং আপনার আইডি 197CURRENT () কল এর মধ্যে একটি সারি haveোকিয়েছে, আপনি অন্য কেউ sertedোকানো রেকর্ডের আইডি পাবেন - সম্ভবত আপনি যা চান তা সম্ভবত নয়। উপরের বেশিরভাগ উত্তরে যেমন উল্লিখিত হয়েছে - বেশিরভাগ ক্ষেত্রে আপনার পরিবর্তে SCOPE_IDENTITY () ব্যবহার করা উচিত।
ট্রন্ডস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.