স্কোপ_আইডেন্টিটি (), পরিচয় (), @@ পরিচয় এবং আইডেন্ট_কন্টেন্ট () এর মধ্যে পার্থক্য কী?


191

আমি জানি Scope_Identity(), Identity(),@@Identity , এবং Ident_Current()সব পরিচয় কলামের মান পেতে, কিন্তু আমি পার্থক্য জানতে চাই।

আমি যে বিতর্ক করছি তার অংশটি হ'ল উপরের এই ফাংশনগুলিতে প্রয়োগ হিসাবে তারা সুযোগ দ্বারা কী বোঝায়?

আমি তাদের ব্যবহারের বিভিন্ন দৃশ্যের একটি সাধারণ উদাহরণ পছন্দ করব?


2
SCOPE_IDENTITY এবং @@ পরিচয়ের জন্য এসকিউএল সার্ভারে থাকা সমান্তরাল এক্সিকিউশন বাগটি সম্পর্কে ভুলে যাবেন না: সমর্থন.
ডেভিড ডি সি ই

@ ডেভিডসিফ্রেটিস - আমি বাগটি সম্পর্কে জানতে আগ্রহী, তবে লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে (বা কমপক্ষে এটি একটি এএসপি ত্রুটি ছুঁড়েছে)।
rory.ap

2
প্রকৃতপক্ষে, আমি এটি পেয়েছি: support.microsoft.com/en-us/kb/2019779
rory.ap

পুরানো কেবি নিবন্ধে উল্লিখিত হিসাবে ফিক্স প্রকাশ করা হয়েছিল
জর্জ বীরবিলিস

উত্তর:


392
  • @@identityফাংশন একই সেশনে তৈরি শেষ পরিচয় ফেরৎ।
  • scope_identity()ফাংশন একই অধিবেশন এবং একই সুযোগ তৈরি শেষ পরিচয় ফেরৎ।
  • ident_current(name)একটি নির্দিষ্ট টেবিল বা কোনো সেশনে দৃশ্য জন্য তৈরি শেষ পরিচয় ফেরৎ।
  • identity()ফাংশন, একটি পরিচয় পেতে ব্যবহৃত হয় না এটি একটি একটি পরিচয় তৈরি করতে ব্যবহার করা হয়ে select...intoজিজ্ঞাস্য।

সেশনটি ডাটাবেস সংযোগ। সুযোগটি হ'ল বর্তমান ক্যোয়ারী বা বর্তমান সঞ্চিত পদ্ধতি।

টেবিলে যদি ট্রিগার থাকে তবে এমন একটি পরিস্থিতি যেখানে scope_identity()এবং @@identityকর্মগুলি পৃথক হয় is আপনার যদি এমন কোয়েরি থাকে যা একটি রেকর্ড সন্নিবেশ করায়, ট্রিগারটি অন্য কোথাও রেকর্ড সন্নিবেশ করে, scope_identity()ফাংশনটি কোয়েরির দ্বারা তৈরি পরিচয়টি ফিরিয়ে দেবে, যখন @@identityফাংশনটি ট্রিগার দ্বারা তৈরি পরিচয়টি ফিরিয়ে দেবে।

সুতরাং, সাধারণত আপনি scope_identity()ফাংশন ব্যবহার করবে ।


14
আমি উত্তর হিসাবে এটি বেছে নিয়েছি, "এমন একটি পরিস্থিতি যেখানে সুযোগ_পরিচয় () এবং @@ পরিচয় ..." অনুচ্ছেদের কারণে। এটি বিষয়গুলিকে আরও স্পষ্ট করে জানিয়েছে।
টেবো

1
ডেভিড ফ্রেইটাস যেমন উপরে উল্লিখিত হয়েছে, স্কোপ_সিটিভিটি বাস্তবায়নে একটি ত্রুটি রয়েছে, তাই আমি বিকল্প পদ্ধতি, ওউটিপিটি ক্লজটি ব্যবহার করার পরামর্শ দিই। আমার উত্তর নীচে দেখুন।
সেবাস্তিয়ান মেইন

@ গুফা - "সেশনটি ডাটাবেস সংযোগ"। আপনি যদি সংযোগ পুলিং ব্যবহার করে থাকেন তবে কী সংযোগ জুড়ে সেশনটি বজায় রাখা হবে?
ডেভ ব্ল্যাক

1
এটি একটি ভূমিকা মডেল উত্তর। বিশেষত, এসকিউএল এবং এসকিউএল সার্ভারের সাথে কাজ করা অদ্ভুত হতে পারে এবং এটি মোটামুটি তথ্যবহুল থাকা সত্ত্বেও সাধারণ বিষয়গুলির বিষয়টিকে খুব স্পষ্টভাবে ব্যাখ্যা করে। এটি দুটি ডাটাবেস বিশেষজ্ঞের মধ্যে কিছু যোগাযোগ হওয়ার মতো শোনাচ্ছে না, যা অন্যান্য অনেক এসই উত্তর দেয়।
Panzercrisis

@ ডেভ ব্ল্যাক আমি যা পড়েছি তা থেকে: না, পুলটিতে সেশনটি রক্ষণাবেক্ষণ করা হয় না, সংযোগের পরে আপনার স্ক্রিপ্ট পরিচালনার জন্য সেশনটি অনন্য। যখন পুলিং করা হয় ... এসকিউএল সার্ভারের জন্য পিএইচপি ওডিবিসি সংযোগ পুলিং ব্যবহার করে। পুল থেকে কোনও সংযোগ ব্যবহার করা হলে সংযোগের অবস্থাটি পুনরায় সেট করা হয়। সংযোগটি বন্ধ করা পুলটিতে সংযোগটি ফিরিয়ে দেয়। (দ্রষ্টব্য: লিনাক্স / ম্যাকের জন্য মন্তব্য দেখুন) ডকস.মাইক্রোসফটকম
us

42

ভাল প্রশ্ন.

  • @@IDENTITY: আপনার এসকিউএল সংযোগ (এসপিআইডি) এ উত্পন্ন শেষ পরিচয় মানটি প্রদান করে। বেশিরভাগ সময় এটি আপনি যা চান তা হ'ল, তবে কখনও কখনও তা হয় না (যখন কোনও INSERTট্রিগারটি কোনও ব্যক্তির প্রতিক্রিয়ায় বহিস্কার হয় এবং ট্রিগার অন্য INSERTবিবৃতি কার্যকর করে)।

  • SCOPE_IDENTITY(): বর্তমান স্কোপে উত্পন্ন শেষ পরিচয় মান প্রদান করে (যেমন সঞ্চিত পদ্ধতি, ট্রিগার, ফাংশন ইত্যাদি)।

  • IDENT_CURRENT(): নির্দিষ্ট সারণির জন্য সর্বশেষ পরিচয় মান প্রদান করে। INSERTএটির কাছ থেকে সনাক্তকরণের মান পেতে এটি ব্যবহার করবেন না , এটি বর্ণের শর্তের সাথে সম্পর্কিত (যেমন একই টেবিলে সারি সন্নিবেশ করা একাধিক সংযোগ)।

  • IDENTITY(): কোনও টেবিলে একটি কলামকে একটি পরিচয় কলাম হিসাবে ঘোষণা করার সময় ব্যবহৃত হয়।

আরও রেফারেন্সের জন্য, দেখুন: http://msdn.microsoft.com/en-us/library/ms187342.aspx

সারসংক্ষেপে: আপনি সারি ঢোকাতে হয়, এবং আপনি সারিতে পরিচয় কলামের মান জানতে চাই আপনি শুধু সন্নিবেশ করানো হয়েছে, সবসময় ব্যবহার SCOPE_IDENTITY()


16

আপনি যদি সুযোগ এবং সেশনের মধ্যে পার্থক্য বুঝতে পারেন তবে এই পদ্ধতিগুলি বোঝা খুব সহজ হবে।

অ্যাডাম অ্যান্ডারসনের একটি খুব সুন্দর ব্লগ পোস্ট এই পার্থক্যটি বর্ণনা করে:

সেশন মানে কমান্ডটি কার্যকর করা বর্তমান সংযোগ।

ব্যাপ্তি মানে একটি আদেশের তাত্ক্ষণিক প্রসঙ্গ context প্রতিটি সঞ্চিত প্রক্রিয়া কল তার নিজস্ব সুযোগে কার্যকর করে এবং নেস্টেড কলগুলি কলিং পদ্ধতির স্কোপের মধ্যে নেস্টেড স্কোপে এক্সিকিউট করে। তেমনিভাবে, একটি অ্যাপ্লিকেশন থেকে চালিত এসকিউএল কমান্ড বা এসএসএমএস তার নিজস্ব ক্ষেত্রের মধ্যে কার্যকর হয় এবং যদি সেই আদেশটি কোনও ট্রিগার গুলি চালায় তবে প্রতিটি ট্রিগার তার নিজস্ব নেস্টেড স্কোপের মধ্যেই কার্যকর করে।

সুতরাং তিনটি পরিচয় পুনরুদ্ধার পদ্ধতির মধ্যে পার্থক্য নিম্নরূপ:

@@identityএই সেশনে উত্পন্ন শেষ পরিচয় মানটি সরবরাহ করে তবে কোনও সুযোগ।

scope_identity()এই অধিবেশন এবং এই সুযোগে উত্পন্ন শেষ পরিচয় মান প্রদান করে ।

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


11

স্কোপ মানে কোড প্রসঙ্গ যা বিশ্বব্যাপী ক্ষেত্রের বিপরীতে, INSERTবিবৃতিটি সম্পাদন করে ।SCOPE_IDENTITY()@@IDENTITY

CREATE TABLE Foo(
  ID INT IDENTITY(1,1),
  Dummy VARCHAR(100)
)

CREATE TABLE FooLog(
  ID INT IDENTITY(2,2),
  LogText VARCHAR(100)
)
go
CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
  INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
  INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END

INSERT INTO Foo (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY 

বিভিন্ন ফলাফল দেয়।


9

@ ডেভিড ফ্রেইটাস দ্বারা উল্লিখিত বাগের কারণে এবং 2012 সালে প্রবর্তিত নতুন সিকোয়েন্স বৈশিষ্ট্যের অসঙ্গতির কারণে আমি এই তিনটি থেকে দূরে থাকার পরামর্শ দেব। পরিবর্তে, আপনি Uোকানো পরিচয় মান পেতে OUTPUT ধারাটি ব্যবহার করতে পারেন। অন্য সুবিধাটি হ'ল OUTPUT এমনকি যদি আপনি একাধিক সারি সন্নিবেশ করিয়ে থাকেন তবেও কাজ করে।

বিশদ এবং উদাহরণের জন্য এখানে দেখুন: পরিচয় সংকট


আমি মনে করি এই উত্তরটি আরও মনোযোগের দাবিদার।
চিজ দিন

দুর্ভাগ্যক্রমে INSERT ... OUTPUT Insert.xx INSERT ট্রিগারগুলির সাথে কাজ করে না (একই আপডেটের জন্য যায় ... OUTPUT আপডেট.xx এবং আপডেট আপডেট)। তারা INSERT ... আউটপুট ইনটোর ব্যবহারের পরামর্শ দিচ্ছেন তবে এটি খুব ভার্জোজ এবং ক্লায়েন্টদের কাছ থেকে এটি ব্যবহার করা (সঞ্চিত প্রকোমের পরিবর্তে) সমস্যাযুক্ত। INSERT ... OUTPUT Insert.XX ক্লায়েন্ট-সাইড কলগুলির সাথে ব্যবহার করার সময় সুন্দর হয় (যদি স্রোতের প্রয়োজন না হয় তবে সন্নিবেশ করার জন্য একটি এক্সিকিউটসকালার প্রয়োজন এবং নতুন সারির জন্য স্বয়ংক্রিয় জেনারেট আইডিটি ফিরে পেতে বলুন) you
জর্জ বীরবিলিস

6

এর সাথে সমস্যাটি স্পষ্ট করতে @@Identity:

উদাহরণস্বরূপ, আপনি যদি কোনও সারণি সন্নিবেশ করান এবং সেই টেবিলটি সন্নিবেশ করানোর কাজ শুরু করে, ট্রিগারটিতে @@Identityসন্নিবেশ থেকে আইডিটি ফেরত দেবে (একটি log_idবা কিছু), যখন scope_identity()আসল সারণিতে সন্নিবেশ থেকে আইডি ফিরিয়ে দেবে।

সুতরাং আপনার যদি কোনও ট্রিগার না থাকে scope_identity()এবং @@identityএকই মানটি ফিরে আসবে। আপনার যদি ট্রিগার থাকে তবে আপনি কোন মানটি চান তা নিয়ে আপনাকে ভাবতে হবে।


4

Scope Identity: কার্যকর করা সঞ্চিত প্রক্রিয়া মধ্যে সর্বশেষ রেকর্ড সনাক্ত।

@@Identity: ক্যোয়ারী ব্যাচের মধ্যে যুক্ত করা সর্বশেষ রেকর্ডের পরিচয়, বা ক্যোয়ারির ফলাফল হিসাবে একটি প্রক্রিয়া যা একটি সন্নিবেশ সম্পাদন করে, তারপরে একটি ট্রিগার ফায়ার করে যা একটি রেকর্ড সন্নিবেশ করে তা ট্রিগার থেকে সন্নিবেশিত রেকর্ডের পরিচয় ফিরিয়ে দেবে।

IdentCurrent: শেষ পরিচয় টেবিলের জন্য বরাদ্দ।


3

বইটির আরও একটি ভাল ব্যাখ্যা এখানে দেওয়া হয়েছে :

এসসিওপিডিআইডিএনটিএটি এবং @@ পরিচয়ের মধ্যে পার্থক্য হিসাবে, ধরুন যে আপনি তিনটি স্টেটমেন্ট সহ একটি স্টোরেজ পদ্ধতি P1 রেখেছেন:
- একটি INSERT যা একটি নতুন পরিচয় মান উত্পন্ন করে
- একটি সঞ্চিত প্রক্রিয়া P2 তে একটি কল যা একটি নতুন উত্পন্ন করে এমন একটি INSERT বিবৃতিও রয়েছে পরিচয় মান
- একটি বিবৃতি যা SCOPE_IDENTITY এবং @@ পরিচয় ফাংশনগুলিতে অনুসন্ধান করে SCOPE_IDENTITY ফাংশনটি P1 (একই অধিবেশন এবং সুযোগ) দ্বারা উত্পন্ন মানটি ফিরিয়ে দেবে। @@ আইডেন্টিটি ফাংশন পি 2 দ্বারা উত্পন্ন মানটি ফিরিয়ে দেবে (সুযোগটি নির্বিশেষে একই অধিবেশন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.