স্কেলার ভেরিয়েবলের মধ্যে এসকিউএল সার্ভার আউটপুট ক্লোজ


134

এটি করার কোনও "সহজ" উপায় আছে বা আমাকে "আউটপুট ... INTO" সিনট্যাক্সের সাহায্যে একটি টেবিল ভেরিয়েবলটি দিয়ে যেতে হবে?

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

উত্তর:


161

আপনার একটি টেবিল পরিবর্তনশীল দরকার এবং এটি সাধারণ হতে পারে।

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

45
তবে তারপরে আমাকে "SELECT @someInt = ID থেকে FIDM" করতে হবে। আমি জানতে চেয়েছিলাম যে এই অতিরিক্ত পদক্ষেপটি (এবং মধ্যস্থতার টেবিল ভেরিয়েবল) এড়িয়ে যাওয়া সম্ভব কিনা যদি আমার প্রয়োজন হয় তবে ফলাফলটি অন্তর্নিহিত হয়।
বেনোইত্র

@ বেনোইত্র - এটি নির্ভর করে আপনি কীভাবে মানটি ব্যবহার করতে যাচ্ছেন, এটি প্রয়োজনীয় নাও হতে পারে, আপনি কোনও নির্বাচিত বিবৃতিটির ধারা থেকে টেবিলটি ব্যবহার করতে পারেন। আপনি যখন কোনও ভেরিয়েবল বরাদ্দ করেন তখন আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে সন্নিবেশটি কেবল একটি সারি .োকানো হয়েছে। এবং যদি সন্নিবেশটি কেবল একটি সারি সন্নিবেশ করায়, সম্ভবত ব্যবহারের পরিবর্তে মান ধারাটিতে যা ব্যবহৃত হয় তা ধরে রাখা সহজ output?
মিকেল এরিকসন

4
স্বতঃ উত্পাদিত মানের ক্ষেত্রে সময়ের আগে (পরিচয়, গণিত কলাম) মানগুলি জানা সম্ভব নয় not আমি বুঝতে পারি যে অনেকগুলি কর্মোচিত আছে। তবুও, আপনি আমাকে যে উত্তরটি খুঁজছিলেন তা আপনি আমাকে দিয়েছিলেন। ধন্যবাদ
বেনোইত্র

এটি একটি নিয়মিত পরিবর্তনশীল প্রয়োজন? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
আরভো বোভেন

30

এক বছরেরও বেশি সময় পরে ... আপনার যা দরকার তা যদি কোনও টেবিলের স্বয়ংক্রিয় উত্পন্ন আইডি পান তবে আপনি ঠিক করতে পারেন

SELECT @ReportOptionId = SCOPE_IDENTITY()

অন্যথায়, মনে হচ্ছে আপনি কোনও টেবিল ব্যবহার করে আটকে আছেন।


6
আমি যে পরিবর্তনশীলটির সন্ধান করছিলাম তা হ'ল পরিচয় কলামের আর কিছু। তবুও, উত্তরের জন্য ধন্যবাদ।
বেনোইট্রে

26
স্পষ্টতই এটিতে একটি মাল্টি প্রসেসর সমান্তরাল পরিকল্পনায় সমস্যা রয়েছে এবং OUTPUT একমাত্র সর্বদা বিশ্বাসযোগ্য পদ্ধতি।
অ্যান্ড্রুব

6
SCOPE_IDENTITY () শেষ INSERT কিছু inোকানো না হলেও কিছু ফেরত দিতে পারে , তাই না? এটি কিছু ক্ষেত্রে এটি অকেজো হয়ে উঠবে।
প্যাট্রিক হনোরেজ

2
আউটপুট ধারাটি ব্যবহার করা আরও ভাল
ক্লে স্মিথ

1
@ অ্যান্ড্রুব উল্লেখ করা বাগটি 2008 আর 2 এসপি 1 এ স্থির হয়েছে ।
adam0101

6

পরে কিন্তু তবুও উল্লেখযোগ্য বিষয় হ'ল আপনি একটি আপডেটের এসইটি ধারাটিতে বা একটি নির্বাচনের ক্ষেত্রেও আউটপুট মানগুলিতে ভেরিয়েবল ব্যবহার করতে পারেন;

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

উপরের উদাহরণে @ ভাল 1 এর পূর্বে মান রয়েছে এবং @ ভাল 2 এর পরের মান রয়েছে যদিও আমি সন্দেহ করি যে ট্রিগার থেকে নেওয়া কোনও পরিবর্তন ভাল 2-তে হবে না তাই আপনাকে সেই ক্ষেত্রে আউটপুট সারণির সাথে যেতে হবে। সরলতম কেস ছাড়া অন্য কোনও কিছুর জন্য, আমি মনে করি আউটপুট টেবিলটিও আপনার কোডে আরও পঠনযোগ্য হবে।

আপনি যদি কলামকে কমা-বিচ্ছিন্ন তালিকায় রূপান্তর করতে চান তবে এটির পক্ষে খুব কার্যকর একটি জায়গা;

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

ধন্যবাদ! এটি আমার প্রয়োজনীয় তথ্য ছিল
উইজউ

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