এসকিউএল সার্ভার - INSERT এর পরে ফেরত মান

আমি একটি INSERT-বিবৃতি পরে একটি মূল মান ফিরে পেতে চেষ্টা করছি। উদাহরণ: আমি গুণাবলী নাম এবং আইডি সঙ্গে একটি টেবিল পেয়েছেন। আইডি একটি উৎপন্ন মান।

    INSERT INTO table (name) VALUES('bob');

এখন আমি একই ধাপে আইডি ফিরে পেতে চাই। কিভাবে এই কাজ করা হয়?

আমরা মাইক্রোসফ্ট এসকিউএল সার্ভার 2008 ব্যবহার করছি।

211
যোগ লেখক Vladimir Vagaytsev, উৎস
আমি এখানে একটি দরকারী উত্তর খুঁজে পেয়েছি: [readystatement-with-statement-return-generated-keys] [1] [1]: stackoverflow.com/questions/4224228/…
যোগ লেখক Lars Ladegaard, উৎস

10 উত্তর

একটি পৃথক SELECT জন্য প্রয়োজন নেই ...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

এটি অ-সনাক্তকারী কলামগুলির জন্যও কাজ করে (যেমন GUIDs)

343
যোগ
আরে, আপনি এসই/এসই দিয়েছেন? আপনার শেষ পোস্ট ডিসেম্বর 14 তারিখ ছিল। যে শুধুমাত্র মন্তব্য থেকে।
যোগ লেখক abatishchev, উৎস
@ জনিলিডস: আপনি এটি একটি পরিবর্তনশীল (এটি একটি টেবিল পরিবর্তনশীল না হওয়া পর্যন্ত) করতে পারবেন না। OUTPUT ক্লায়েন্ট বা একটি টেবিল যায়
যোগ লেখক gbn, উৎস
@ হজিকেলিস্ট: এটি বেশ প্রান্তিক ব্যাপার, ট্রিগারটিতে সেট করুন NCOOUNT অন সাধারণত ট্রিগারে সহায়তা করে। stackoverflow.com/questions/1483732/set-nocount-on -usage দেখুন
যোগ লেখক gbn, উৎস
@@ আইডেন্টিটি ব্যবহার করবেন না। SCOPE_IDENTITY, হ্যাঁ, কিন্তু @@ আইডেন্টিটি না। এটা অবিশ্বস্ত
যোগ লেখক gbn, উৎস
আপনি একটি বিট বিস্তৃত করতে পারে? আউটপুট এই উদাহরণে যান কোথায়? ডকুমেন্টেশন কেবলমাত্র টেবিলগুলির জন্য উদাহরণ দেখায় (আউটপুট ... ব্যবহার করে )। আদর্শভাবে আমি শুধু একটি পরিবর্তনশীল মধ্যে এটি পাস করতে সক্ষম হতে চাই
যোগ লেখক Jonny Leeds, উৎস
আপনি @@ আইডেন্টিটি এবং অন্যদেরও ব্যবহার করতে পারেন। এবং ধারা আদেশ গুরুত্বপূর্ণ! (হার্ড উপায় খুঁজে পাওয়া যায় নি ..)
যোগ লেখক Z. Khullah, উৎস
@ জিবিএন আমি অসম্মতি - ট্রিগারগুলি অত্যন্ত সাধারণ। আমি নিশ্চিত নই যে NOCOUNT সংশোধনগুলি সেট করে, গভীর ব্যাখ্যা দেওয়ার জন্য দয়া করে সেই MSNN পোস্টটি পড়ুন।
যোগ লেখক hajikelist, উৎস
দুর্ভাগ্যবশত, আপনি টেবিলে একটি ট্রিগার যোগ করার পরে আপনার উপর নির্ভর করতে পারবেন না আপনার বিবৃতি বিরতি! আবারঃ blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/…
যোগ লেখক hajikelist, উৎস

নতুন আইডি মান পেতে SCOPE_IDENTITY() ব্যবহার করুন

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

126
যোগ
@ liho1eye - OP পরিচয় কলামের নামটি id হিসাবে উল্লেখ করেছে, তাই হ্যাঁ।
যোগ লেখক Curt, উৎস
id অনুমান করা হচ্ছে পরিচয়
যোগ লেখক Ilia G, উৎস
বড় সিস্টেমে, একই সময়ে যদি অনেক এসকিউএল চালানো হয়? এটা কি প্রতি অনুরোধে শেষ সন্নিবেশকৃত আইডি ফেরত দেবে?
যোগ লেখক Shiv, উৎস
@ শিভ "SCOPE_IDENTITY শুধুমাত্র বর্তমান সুযোগের মধ্যে ঢোকানো মূল্যগুলি ফেরত দেয়"
যোগ লেখক goodies4uall, উৎস
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

ট্রিগারগুলির সাথে টেবিলগুলিতে OUTPUT ক্লজ দ্বন্দ্বের সাথে একটি পরিচিত সমস্যা থাকার কারণে নিরাপদ বিট হয়। আপনার টেবিলে বর্তমানে কোনো ট্রিগার নেই এমনটি এমনকি এটি অবিশ্বাস্য করে তোলে - লাইনটি নীচে যুক্ত করে কেউ আপনার আবেদনটি ভাঙ্গবে। সময় বোমা আচরণ আচরণ।

গভীর ব্যাখ্যা জন্য msdn নিবন্ধ দেখুন:

http : //blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

30
যোগ
@ হিজিকেলিস্ট আমরা সবাই উত্তরাধিকারী, কিন্তু অউউটপুত আপগ্রেড হওয়া ট্রিগারগুলির ঝুঁকি কম, এটি যা করে তা নোকাউন্ট সেট করে। যদি কেউ ট্রিগার যুক্ত করে তবে সেগুলি কীভাবে কোড করতে হবে তা বোঝা উচিত (আপনাকে বোঝায় যে আপনার নিয়ন্ত্রণ আছে), অথবা আপনার ডেভেলপারদের প্রশিক্ষণ দিতে হবে। কিছু সময়ে, যখন আপনি SQL এর সংস্করণটি আর নেই তখন মাইগ্রেট করতে বাধ্য হবেন সমর্থিত ইত্যাদি তাই ট্রিগার একটি ফলাফল তৈরি হবে না। যাইহোক, এটি সর্বোত্তম উত্তর নয় কারণ যদি আপনার ট্রিগারগুলি ইনস্টল থাকে তবে SCOPE_IDENTITY কাজ করবে না ( stackoverflow.com/questions/908257/… )
যোগ লেখক gbn, উৎস
শুধুমাত্র যদি আপনি ট্রিগারগুলিতে সেট নোটটি যোগ করেন না। এছাড়াও দেখুন docs.microsoft.com/en-us/sql/database-engine/configure-windo‌ WS/করছে & hellip;
যোগ লেখক gbn, উৎস
এই আমাদের legacy পরিবেশ @ gbn জন্য একটি বিকল্প নয়
যোগ লেখক hajikelist, উৎস
@ জিবিএন - আমি শুধু এই মত মূর্খ জিনিস এড়াতে চাই। আমি আমার সমস্ত ডেভেলপারদের বলব না, "প্রতিটি ট্রিগারে 'আমার অ্যাপ্লিকেশন বিবৃতিটি ভাঙ্গবেন না' যোগ করতে ভুলবেন না।" - তুমি এটা রাখতে পারো. "পরিবর্তে" দৃশ্যকল্প একটি প্রান্ত কেস ইমো অনেক বেশি।
যোগ লেখক hajikelist, উৎস

এনটাইটেল ফ্রেমওয়ার্ক জিবিএন এর উত্তর অনুরূপ কিছু সম্পাদন করে:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

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

আউটপুট ফলাফল একটি অস্থায়ী টেবিল পরিবর্তনশীল মধ্যে সংরক্ষিত হয়, এবং তারপর ক্লায়েন্ট ফিরে নির্বাচিত। গোচচা সচেতন হতে হবে:

সন্নিবেশগুলি একাধিক সারি তৈরি করতে পারে, তাই ভেরিয়েবল একাধিক সারি ধরে রাখতে পারে, সুতরাং আপনাকে একাধিক আইডি

এর থেকে বেশি ফেরত পাঠানো যেতে পারে।

আমি কোনও ধারণা নেই কেন EF অভ্যন্তরীণ টেবিলটিতে আসল টেবিলে ফিরে যাবে (কোন পরিস্থিতিতে মিলিত হবে না)।

কিন্তু যে ইএফ কি করে।

এসকিউএল সার্ভার 2008 বা শুধুমাত্র নতুন। এটা 2005 এর পরে আপনি ভাগ্য আউট করছি।

12
যোগ

@@ আইডেন্টিটি একটি সিস্টেম ফাংশন যা শেষ-সন্নিবেশকৃত পরিচয় মান প্রদান করে।

7
যোগ
@@ আইডেন্টিটি ব্যবহার করে কখনোই পরামর্শ দিতে হবে - এটি সঠিক (অত্যধিক বিস্তৃত) খুব কম থ্রেড-নিরাপদ নয় - দয়া করে @ কার্টের উত্তরটি SCOPE_IDENTITY() সম্পর্কে দেখুন।
যোগ লেখক zanlok, উৎস

After doing an insert into a table with an identity column, you can reference @@IDENTITY to get the value: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx

5
যোগ
হ্যাঁ, এটা ব্যবহার করবেন না। এটা ভালভাবে কাজ করে না: এক্স
যোগ লেখক H.Ghassami, উৎস
কখনোই @@ আইডেন্টিটি ব্যবহার করবেন না: এটি স্কোপ নিরাপদ নয়: ট্রিগার ইত্যাদি এটি প্রভাবিত করে।
যোগ লেখক gbn, উৎস

আপনি কেবলমাত্র ভেরিয়েবলের মধ্যে সন্নিবেশকৃত সারির আইডিটি নির্বাচন করতে scope_identity ব্যবহার করতে পারেন এবং তারপরে আপনি যে টেবিলে যে কলামগুলি চান তা নির্বাচন করুন যেখানে আইডি = স্কপ_ডেন্টিটি থেকে আপনি যে পরিচয় পেয়েছেন তা নির্বাচন করুন

See here for the MSDN info http://msdn.microsoft.com/en-us/library/ms190315.aspx

3
যোগ

* Parameter order in the connection string is sometimes important. * The Provider parameter's location can break the recordset cursor after adding a row. We saw this behavior with the SQLOLEDB provider.

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

2
যোগ
আপনি আপনার উত্তর সম্পাদনা এবং উন্নত করতে হবে। এটা বর্তমানে শোরগোল এবং একটি শালীন উত্তর বা এমনকি একটি প্রচেষ্টা হিসাবে জুড়ে আসে না
যোগ লেখক James, উৎস
বেশিরভাগ ব্যবহারকারী সম্ভবত এই পৃষ্ঠায় এসেছিল কারণ তাদের যুক্ত করা সারি চিহ্নিত করার জন্য বৈধ ক্ষেত্র নেই। এই আচরণটি আমরা খুঁজে পেয়েছি (যেটি কেবল সংযোগ স্ট্রিংয়ের প্যারামিটারের ক্রম পরিবর্তন করে তা অবিলম্বে নতুন যোগ করা সারি অ্যাক্সেস করার অনুমতি দেয়) তাই বিজড়িত যে আমি মনে করি এটি ক্যাপগুলিতে উল্লেখ করার যোগ্য, বিশেষত এটি সম্ভবত নতুন কারণ চায় সারি আইডি এবং যে সারি অন্যান্য ক্ষেত্র। কেবলমাত্র প্রথম পরামিতি হিসাবে সরবরাহকারীটি স্থাপন করে, সমস্যাটি অদৃশ্য হয়ে যায়।
যোগ লেখক David Guidos, উৎস
আপনি কি "শোরগোল" মানে ঠিক কি? আপনি আপনার অভিযোগ ব্যাখ্যা করতে হবে। এটা হতে পারে হিসাবে হিসাবে সহজ সম্পর্কে। আপনি যদি আপনার সংযোগ স্ট্রিংয়ের পরামিতিগুলির ক্রম পরিবর্তন করেন তবে এটি সন্নিবেশের পরে সারি তথ্য উপলব্ধ কিনা তা প্রভাবিত করতে পারে।
যোগ লেখক David Guidos, উৎস
আপনি কীভাবে এই মন্তব্যটি উত্তর দিতে পারেন/জিজ্ঞাসা করা প্রশ্নটির সাথে প্রাসঙ্গিক? আমি এটা capaps/গাঢ় যোগ্য মনে হয় না। আপনার উত্তর সহায়ক বলে মনে হয়, ব্যবহারকারীরা এটি ভোট হবে।
যোগ লেখক n__o, উৎস

আপনি আপনার সন্নিবেশ বিবৃতিতে একটি নির্বাচন বিবৃতি যোগ করতে পারেন। Integer myInt = টেবিল 1 (FName) মানগুলিতে প্রবেশ করান ('ফ্রেড'); Scope_Identity নির্বাচন করুন (); Scaler নির্বাহ করার সময় এটি পরিচয় একটি মান ফিরে আসবে।

0
যোগ

SQL সার্ভারে পরিচয় কলাম হিসাবে আইডি ব্যবহার করে এমন একটি টেবিলে সন্নিবেশ করাতে যখন আমি আউটপুট সন্নিবেশ করা হল এটি হল:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
0
যোগ