সনাক্তকরণের মান পেতে আমি কীভাবে একটি INSERT বিবৃতির OUTPUT ধারা ব্যবহার করব?


240

আমার যদি সন্নিবেশ বিবৃতি থাকে যেমন:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

OUTPUT ধারাটি ব্যবহার করে আমি কীভাবে @var INTনতুন সারির সনাক্তকরণ মানকে (কল করা Id) সেট করব ? আমি উদাহরণস্বরূপ সারণি ভেরিয়েবলের মধ্যে INSERTED.Name রাখার নমুনা দেখেছি, তবে আমি এটি একটি নন-টেবিল ভেরিয়েবলের মধ্যে পেতে পারি না।

আমি চেষ্টা করেছি OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Idকিন্তু তন্ন তন্ন কাজ করেছি।


3
আমি ইতিমধ্যে @@ SCOPE_IDENTITY সম্পর্কে জানি, আমি বিশেষভাবে এটি OUPUT দিয়ে কীভাবে করব তা জানতে চাই। ধন্যবাদ।
ইয়াাত্রিক্স

6
আপনাকে এটি একটি টেবিল ভেরিয়েবলের মধ্যে প্রবেশ করাতে হবে এবং তার থেকে নির্বাচন করুন। OUTPUTধারা থেকে সরাসরি স্কেলার ভেরিয়েবলের জন্য নির্ধারণের কোনও বাক্য গঠন নেই ।
মার্টিন স্মিথ

3
আউটপুট দফা একটি টেবিল বা টেবিল পরিবর্তনশীল মধ্যে আউটপুট হয়েছে ..
mellamokb

5
OUTPUTদফা একটি টেবিলে লিখেছেন। এটি একটি টেবিল পরিবর্তনশীল, অস্থায়ী টেবিল, ... হতে পারে।
হাবো

2
আমার প্রশ্নটি বিশেষত OUTPUT ধারাটির জন্য জিজ্ঞাসা করে।
ইয়াত্রিক্স

উত্তর:


464

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

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

আপনি এটি যেমন সি # থেকেও ব্যবহার করতে পারেন, যখন আপনার আইডিটি আপনার কলিং অ্যাপটিতে ফিরে আসতে হয় - ফলাফলটি পড়ার জন্য কেবল .ExecuteScalar()(পরিবর্তে .ExecuteNonQuery()) দিয়ে এসকিউএল কোয়েরি সম্পাদন করুন ID

বা যদি আপনাকে IDটি-এসকিউএল এর ভিতরে সন্নিবেশ করা প্রয়োজন (উদাহরণস্বরূপ পরবর্তী প্রসেসিংয়ের জন্য), আপনার একটি টেবিল ভেরিয়েবল তৈরি করতে হবে:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

এইভাবে, আপনি একাধিক মান স্থাপন করতে পারেন @OutputTblএবং সেগুলিতে আরও প্রক্রিয়াজাতকরণ করতে পারেন । আপনি এখানে "নিয়মিত" অস্থায়ী টেবিল ( #temp) বা এমনকি "আউটপুট লক্ষ্য" হিসাবে "সত্য" স্থায়ী টেবিলটি ব্যবহার করতে পারেন ।


2
পিছনের কোডটির জন্য এখানে উত্তরটি সংক্ষিপ্ত ছিল। এক্সিকিউটিস্কেলার () এফটিডব্লিউ
জো জনস্টন

10
আপনি একটিতে ফলাফল সন্নিবেশ করতে পারেন real persistent table- এটি অত্যন্ত চমত্কার কারণ এর অর্থ হল আপনি একই সময়ে টেবিলে INSERTতথ্য দিতে পারেন TWO

7
উপরে থেকে টানতে কখনই @@ পরিচয় ব্যবহার করবেন না। ট্রিগারগুলির সাথে কঠোরভাবে কাজ করার জন্য এবং যেহেতু তারা একটি টেবিলে পরিবর্তিত হওয়ার ইতিহাস রেকর্ড করছে এবং একই সময়ে একটি নতুন টেবিলের মধ্যে @@োকানো হয়েছে @@ পরিচয় ইতিহাসের সারণী থেকে মানগুলি ফিরিয়ে দেওয়া শুরু করে। হাসিখুশি সেখান থেকে! দয়া করে marc_s এর সমাধানটি ব্যবহার করুন। আপাতত আমি @ আউটপুটটিবিএল পদ্ধতিটি নিয়ে চলেছি তবে আমি অন্যান্য বিকল্পগুলি দ্বারা আগ্রহী।
এরিক বিশার্ড 20'16

4
OUTPUT INTO অত্যন্ত চমত্কার ব্যতীত যে "OUTPUT INTO ধারাটির লক্ষ্য সারণি একটি (প্রাথমিক কী, বিদেশী কী) সম্পর্কের কোনও দিকে থাকতে পারে না", যা আমার জন্য প্রায় 99% সম্ভাব্য ব্যবহারের ক্ষেত্রে is আমি এটি ধরে নিয়েছি কারণ OUTPUT ধারাটি লেনদেনটি আবার ঘুরিয়ে দেওয়া হলেও তথ্য ফেরত দিতে পারে তবে এটি একটি সামান্য বিরক্তিকর বিষয় যা একটি শটে সম্পর্কিত টেবিল এ এবং বিতে ডেটা toোকানো এত কঠিন।
রবার্ট ক্যালহাউন

3
@ এরিকবিশার্ড এর SCOPE_IDENTITY()জন্য আরও ভাল কাজ করে।
ডেরেক ডিন 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.