এসকিউএল সার্ভার নির্বাচন করুন @ পরিবর্তনশীল?


250

আমার এক সেক্যালে (২০০৮) সঞ্চিত প্রক্সে আমার নীচের কোড রয়েছে যা পুরোপুরি সূক্ষ্মভাবে কার্যকর করে:

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

সুতরাং আপনার বলছিদের জন্য প্রশ্নটি হ'ল লাইন ধরে কিছু করার সম্ভাবনা রয়েছে:

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

যাতে আমি নিম্নলিখিত অন্যান্য বিবৃতিগুলিতে মেমরি থেকে এই ডেটাটি পুনরায় ব্যবহার করতে পারি? এসকিউএল সার্ভার উপরের স্টেটমেন্টের সাথে একটি ফিট নিক্ষেপ করে, তবে আমি আলাদা আলাদা ভেরিয়েবল তৈরি করতে এবং তাদের প্রত্যেককে একই টেবিলের বিপরীতে পৃথক নির্বাচনী স্টেটমেন্টের মাধ্যমে আরম্ভ করতে চাই না .... UGH !!!

একই টেবিলের বিপরীতে একাধিক প্রশ্ন ছাড়া লাইন ধরে কীভাবে কিছু অর্জন করবেন সে সম্পর্কে কোনও পরামর্শ?


1
"পৃথক ভেরিয়েবল তৈরি করতে এবং তাদের প্রত্যেককে পৃথক পৃথক নির্বাচন বিবরণের মাধ্যমে সূচনা করতে" - আপনাকে কেন এটি করতে হবে? declare @t tableএকবার, এবং আপনার যদি এটি পুনঃব্যবহারের প্রয়োজন হয় তবে DELETE @TempCustomerএটিতে আবার
serোকানোর

উত্তর:


204

আপনি .. নির্বাচন করতে পারবেন না .. একটি টেবিল বৈকল্পিক। আপনি যা করতে পারেন তা হ'ল প্রথমে এটি তৈরি করা, তারপরে এটি sertোকানো। আপনার দ্বিতীয় স্নিপেট হতে হবে

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

5
উল্লেখ্য যে এটি একটি সিটিই প্রসঙ্গেও ঠিক কাজ করে। Bazinga!
মাইকেল ক্রাকলিস

4
যেহেতু একটি বাস্তব অস্থায়ী টেবিলের সাথে আপনি যেমন করে কোনও টেবিলের পরিবর্তনশীল কেন নির্বাচন করতে পারবেন না সে সম্পর্কে কারও উত্তর রয়েছে?
কেএসউইফ্ট 87

504

আপনি যদি পরবর্তী ব্যবহারের জন্য কিছু ভেরিয়েবল সহজভাবে নির্ধারণ করতে চান, তবে আপনি এই লাইনগুলির সাথে কিছু দিয়ে একটি শট এ করতে পারেন:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

যদি আপনি যে ধরণের জিনিসটি পরে থাকেন


1
সেরা উত্তর ইমো, তবে ফলাফল একের বেশি হলে কী হবে?
ক্যাপিটানো 666

ফলাফল যদি একের বেশি হয় তবে আপনি উপলব্ধ মানগুলির মধ্যে একটি পাবেন। এটি একটি আকর্ষণীয় ধাঁধা তৈরি করতে পারে! দেখুন mssqltips.com/sqlservertip/1888/…
স্মান্ডোলি

8
কোয়েরিকে একক সারিতে ফিরতে বাধ্য করার জন্য নির্বাচন করুন শীর্ষ 1
অ্যাড্রিয়ান

1
@ অ্যাড্রিয়ান হ্যাঁ, উপরের প্রশ্নটি ধরে নিয়েছে যে আপনি একটি একক সারি নির্বাচন করেছেন। আপনি আরও অভিনব যুক্তি চাইলে আপনি অর্ডারিং এবং সামগ্রিক ফাংশনগুলিও ব্যবহার করতে পারেন।
16

1
যদি আপনি ওপি ব্যবহার করছেন যে ডাটাবেস টাইপটি ব্যবহার না করে থাকেন তবে অ্যাড্রিয়ান উল্লেখ করেছেন যে সমস্ত 1 টপ 1 সমর্থন করে না। এসকিউএল সার্ভার / এমএস অ্যাক্সেস টপ ব্যবহার করে, মাইএসকিউএল লিমিট ব্যবহার করে এবং ওরাকল রাউনুম ব্যবহার করে। আরও তথ্যের জন্য w3schools.com/sql/sql_top.asp দেখুন ।
টাইলার

33

তুমি এটি করতে পারো:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

তাহলে পরে

SELECT CustomerId FROM #tempCustomer

আপনার #tempCustomer এর কাঠামো ঘোষণা করার দরকার নেই


3
@ ওয়েবেটার্নার এই পয়েন্টগুলির কোনওটিই সত্য নয়। টেম্প টেবিলগুলি প্রোকের বাইরে স্কোপ করা হয় না এবং টেবিলের ভেরিয়েবলগুলি টেম্প টেবিলগুলির চেয়ে কোনও "মেমরি কেবল" নয়।
মার্টিন স্মিথ

7
DROP TABLE #tempCustomerযখন #tempCustomerআর প্রয়োজন হয় না তখন একটি যুক্ত করতে ভুলবেন না অন্যথায় পরবর্তী নির্বাচনটি একটি #tempCustomer already existsত্রুটির কারণ
ঘটবে

15

দেখে মনে হচ্ছে আপনার সিনট্যাক্সটি কিছুটা বাইরে। এর কিছু ভাল উদাহরণ রয়েছে

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

তাহলে পরে

SELECT CustomerId FROM @TempCustomer

2

আপনার মতো টেম্প টেবিলগুলি লাগবে। http://www.sqlteam.com/article/temporary-tables

মনে রাখবেন যে # টেম্পটেবল আপনার এসপি জুড়ে উপলভ্য।

নোট করুন ## টেম্পটেবল সকলের জন্য উপলব্ধ।


2
## লোভনীয় - যতক্ষণ না মালিক (স্রষ্টা) এটি মুছে না ফেলে বা সংযোগ বিচ্ছিন্ন হয়ে যায়
রিচার্ড

4
আমি টেম্প টেবিল চাই না। টেম্প টেবিলগুলি ব্যয়বহুল এবং ধীর। আমি কেবলমাত্র একটি স্বল্প পরিমাণের জন্য একটি নির্দিষ্ট রেকর্ডের জন্য কিছুটা তথ্য রাখতে এবং পরবর্তী লকআপগুলি ছাড়াই একাধিক স্কয়ার বিবৃতিতে এটি উপলব্ধ করতে চাই। যেহেতু সারণি ভেরিয়েবলগুলির স্টোর করা প্র্যাকের মধ্যে সেগুলি সংজ্ঞায়িত করা হয় সেগুলির মধ্যে সুযোগ রয়েছে, তাই তারা সেই এক স্টোর
প্রোক

3
আমি এও উল্লেখ করতে ভুলে গেছিলাম যে ডিবি আউুরে থাকছে .... আমি টেম্প টেবিলগুলি পরিচালনা করে কোনও গোলমাল শুরু করতে চাই না।
bleepzter

পরিবর্তনশীল টেবিলটি যাওয়ার উপায়। @ ভার্টেবল টেবিলটি ঘোষণা করুন (....)
আরলিবার্টেরিয়ান

1

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

এখন পর্যন্ত আমি যা করি তা হ'ল সম্পূর্ণ এসকিউএল কোডটি ব্যবহারের জন্য ভেরিয়েবলের সাথে একত্রিত করে। এটার মত:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '+@table_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

আমি আশা করি এটি সাহায্য করে, তবে কোডটি যদি খুব বড় হয় তবে এটি জটিল হতে পারে, আপনি যদি আরও ভাল উপায় খুঁজে পান তবে দয়া করে ভাগ করুন!


-2
"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

যার অর্থ @tempCustomerগ্রাহক থেকে নতুন টেবিল পরিবর্তনযোগ্য এবং dataোকানো ডেটা তৈরি করা । আপনি ইতিমধ্যে এটি উপরে ঘোষণা করেছিলেন তাই পুনরায় ঘোষণার দরকার নেই। সঙ্গে যেতে ভাল

INSERT INTO @tempCustomer SELECT * FROM Customer

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