টি-এসকিউএল-তে একটি টেবিল ভেরিয়েবল নির্বাচন করুন


372

একটি জটিল নির্বাচন করুন কোয়েরি পেয়েছেন, সেখান থেকে আমি সমস্ত সারিগুলি একটি টেবিল ভেরিয়েবলের মধ্যে sertোকাতে চাই, তবে টি-এসকিউএল এটির অনুমতি দেয় না।

একই লাইন বরাবর, আপনি নির্বাচন করুন বা INSERT EXEC ক্যোয়ারী সহ একটি টেবিল ভেরিয়েবল ব্যবহার করতে পারবেন না। http://odetocode.com/Articles/365.aspx

সংক্ষিপ্ত উদাহরণ:

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

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

উত্তর:


601

এরকম কিছু চেষ্টা করুন:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

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

এটি নামটির পক্ষে কিছু নয়, কেবলমাত্র কলামের ধরণের।
ক্রিসটিসি

5
বাহ এই ধরণের অর্থ উপলব্ধি করে তবে একই সাথে আমার মধ্যে পার্সার এক প্রকার ক্ষোভ অনুভব করে :)
আরান মুলহোল্যান্ড

আমি আপডেটের বিবৃতিতে (গুলি) এটি ব্যবহার করতে সক্ষম বলে মনে হচ্ছে না: সংক্ষিপ্ত লিঙ্ক
পল-সেবাস্তিয়ান মানোলে

1
একটি সন্নিবেশ বিবৃতিতে, আপনি যদি কলামগুলি স্পষ্টভাবে ঘোষণা না করেন, তবে সেগুলি সিলেক্ট * ডান মতো আসল তৈরি সারণী বিবৃতিতে ঘোষিত ক্রমে ম্যাপ করা হয়। সুতরাং, নির্বাচনের বিবৃতিতে অবস্থানটি @ ব্যবহারকারী ডেটা টেবিলের মধ্যে পুরানো স্থানের সাথে ম্যাপ করা হয়েছে কারণ নির্বাচনের ফলাফলের সেটটিতে অবস্থানটি ২ নম্বরে রয়েছে এবং সারণির সংজ্ঞাতে ওল্ড অবস্থানটি কলাম 2। বলেছিল, কখনও এই কাজ করবেন না। কলাম বা সারিগুলির ডাটাবেস ক্রম নির্ভর করা যায় না। সর্বদা এটি সম্পর্কে সুস্পষ্ট থাকুন।
এবিস্মিতগুলি

94

এর উদ্দেশ্য SELECT INTO(ডক্স অনুসারে, আমার জোর)

অন্য সারণীতে মানগুলি থেকে একটি নতুন টেবিল তৈরি করতে

তবে আপনি ইতিমধ্যে আছে একটি লক্ষ্য টেবিল! সুতরাং আপনি কি চান

দ্য INSERTবিবৃতি একটি টেবিল এক বা একাধিক নতুন সারি যোগ

আপনি নিম্নলিখিত উপায়ে ডেটা মান নির্দিষ্ট করতে পারেন:

...

SELECTএক বা একাধিক সারিগুলির জন্য ডেটা মান নির্দিষ্ট করতে একটি subquery ব্যবহার করে যেমন:

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

এবং এই বাক্য গঠনতে এটি MyTableএকটি টেবিল ভেরিয়েবল হিসাবে অনুমোদিত।


1
সত্যই গ্রহণযোগ্য উত্তরটি এই তথ্যটি অন্তর্ভুক্ত করতে চান!
ডেভি ব্রাউন

আমি পেয়েছি মাই টেবিলটি "অবৈধ অবজেক্ট নাম" এটি করছে, সুতরাং এই উত্তর থেকে কিছু অনুপস্থিত।
মাইক ফ্লিন

@ মাইকফ্লিন আপনার প্রকৃত সারণির নামের জন্য MyTableএকটি স্থানধারক । আমি মনে করি না নামের কোনও টেবিলের সাথে কোনও আসল ডাটাবেস রয়েছে ...MyTable
আকাশ

এবং যদি আমি নির্বাচন করুন / এর সাথে একটি সারণী ভেরিয়েবল তৈরি / ঘোষণা করতে চাই ...? উদাহরণস্বরূপ, সারণি ভেরিয়েবলের কলামগুলি t1.somecolumn, t1.othercolumn, t2 হিসাবে সংজ্ঞায়িত করার জন্য
আর্মান্দো

27

অস্থায়ী ডেটাসেটগুলি সঞ্চয় করতে আপনি সাধারণ টেবিল এক্সপ্রেশনও ব্যবহার করতে পারেন। তারা আরও মার্জিত এবং অ্যাডহক বন্ধুত্বপূর্ণ:

WITH userData (name, oldlocation)
AS
(
  SELECT name, location 
  FROM   myTable    INNER JOIN 
         otherTable ON ...
  WHERE  age>30
)
SELECT * 
FROM   userData -- you can also reuse the recordset in subqueries and joins

এটা খুবই পছন্দ করি! ধন্যবাদ.
ফোরস্পাস্টমিডনাইট

আমি মনে করি না এটি একটি অনুলিপি তৈরি করে, আপনি যদি ব্যবহারকারী ডেটা মুছলে বা আপডেট করেন তবে এটি কি আপনার মূল সারণীতে রেকর্ড মুছে ফেলা এবং আপডেট করবে না?
atreeon

হ্যাঁ, সিটিইতে মুছে ফেলুন এবং আপডেট করুন যতক্ষণ না সিটিই যোগ দেয়, ইউনিয়ন ইত্যাদি ব্যবহার করে একাধিক টেবিলগুলিকে রেফারেন্স দেয় না
ন্যানেস্তেভ

2
এর খারাপ দিকটি হ'ল আপনি কেবলমাত্র নীচের কমান্ডগুলিতে সিটিই টেবিলটি ব্যবহার করতে পারেন। আপনার প্রয়োজনে যে কারণে সিটিই কাজ করবে না ফলাফলের মাধ্যমে একাধিক পাস করতে হবে। ওপিটিকে বোঝা যাচ্ছে যে একাধিক পরিবর্তন করা হবে, এক্ষেত্রে এটি কাজ করবে না - "টেবিলের ভেরিয়েবলের ডেটা পরে এটি বিভিন্ন সারণিতে সন্নিবেশ / আপডেট করতে ব্যবহৃত হত (বেশিরভাগ ক্ষেত্রে নাবালকের সাথে একই ডেটার অনুলিপি) আপডেট)। "
টনি

16

আপনি যদি কোনও অ্যাপ্লিকেশন থেকে এটি না করে থাকেন তবে অস্থায়ী টেবিলগুলি ব্যবহার করার চেষ্টা করতে পারেন। (এটি ম্যানুয়ালি চালানো ঠিক হবে)

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

আপনি সেইভাবে টেবিলটি ঘোষণার প্রচেষ্টাটি এড়িয়ে যান ... অ্যাডহক প্রশ্নের জন্য সহায়তা করে ... এটি একটি স্থানীয় টেম্প টেবিল তৈরি করে যা অন্য সেশনে দৃশ্যমান হবে না যদি আপনি একই সেশনে না থাকেন। আপনি যদি কোনও অ্যাপ্লিকেশন থেকে ক্যোয়ারী চালাচ্ছেন তবে সমস্যা হতে পারে।

যদি আপনার কোনও অ্যাপ্লিকেশন চলতে থাকে তবে এইভাবে ঘোষিত ভেরিয়েবলগুলি ব্যবহার করুন:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

সম্পাদনা করুন: আপনারা অনেকেই সংযোগ থেকে সেশনে আপডেট দৃশ্যমানতার কথা উল্লেখ করেছেন। ওয়েব অ্যাপ্লিকেশনগুলির জন্য টেম্প টেবিল তৈরি করা কোনও বিকল্প নয়, কারণ সেশনগুলি পুনরায় ব্যবহার করা যেতে পারে, সেই ক্ষেত্রে টেম্প ভেরিয়েবলগুলিকে আটকে দিন


2
দুঃখিত, উল্লেখ করতে ভুলে গেছি আমার তৈরি টেবিলের অধিকার নেই।
ইন্দ্রেইক

6
একটি টেম্প তৈরির ক্ষেত্রে আরও কিছুটা ওভারহেড থাকে।
পাপারাজ্জো

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

12
@ ফ্র্যাঙ্ক - যদি আপনি একটি গ্লোবাল টেম্প টেবিল ব্যবহার করেন (দুটি হ্যাশ উপসর্গ) আপনি সঠিক। তবে, একটি স্থানীয় টেম্প টেবিল (একটি হ্যাশ উপসর্গ) একক সেশনে বিচ্ছিন্ন হয়ে যাবে (ওরফে একক সংযোগ) সুতরাং আপনি সমস্ত অনুরোধের জন্য একটি একক সংযোগ ব্যবহার না করা পর্যন্ত আপনি যে সম্মতিযুক্ত ইস্যুগুলিতে ইঙ্গিত করছেন তা থাকবে না (না পরামর্শ দেওয়া)। সম্ভাব্য পারফরম্যান্সের প্রভাবগুলি এখনও রয়ে গেছে।
maf748

@ গ্যাজবি শিওর, পার্শ্ব-প্রতিক্রিয়াযুক্ত যে কোনও বিবৃতি এ-তে ব্যবহার করা থেকে বাদ দেওয়া হয়েছে function। আমার অভিজ্ঞতায়, বেশিরভাগ ক্ষেত্রে যেখানে কেউ মনে করেন যে তাদের এ জাতীয় বিবৃতি প্রয়োজন, এর অর্থ হ'ল তাদের তাদের function- বা কমপক্ষে রিএফেক্টরটি এ সম্পর্কে পুনর্বিবেচনা করা উচিত procedure। আমার পক্ষে কথা বলছি, অন্তত। :-)
আন্ডারস্কোর_২


5

প্রথমে একটি টেম্প টেবিল তৈরি করুন:

ধাপ 1:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

** পদক্ষেপ 2: ** টেম্প সারণীতে কিছু মান সন্নিবেশ করান।

insert into #tblom_temp values('Om Pandey',102,1347)

পদক্ষেপ 3: টেম্প টেবিলের ডেটা ধরে রাখতে একটি টেবিলের পরিবর্তনশীল ঘোষণা করুন।

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

পদক্ষেপ 4: টেম্প টেবিল থেকে মান নির্বাচন করুন এবং সারণী ভেরিয়েবলের মধ্যে সন্নিবেশ করুন।

insert into @tblOm_Variable select * from #tblom_temp

শেষ অবধি মানটি একটি টেম্প টেবিল থেকে সারণী ভেরিয়েবলে সন্নিবেশ করা হয়

পদক্ষেপ 5: সারণী ভেরিয়েবলের মধ্যে সন্নিবেশিত মানটি পরীক্ষা করতে পারে।

select * from @tblOm_Variable

1

ঠিক আছে, এখন আমি যথেষ্ট চেষ্টা করে নীচে ব্যবহার করে @ টেবিলটিতে সন্নিবেশ করতে সক্ষম:

ঢোকান @TempWithheldTable নির্বাচন
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, OPENROWSET থেকে a.ReasonCode (বাল্ক 'সি: \ ডাটাবেস \ WithHeld.csv', FORMATFILE = N'C: \ ডাটাবেস \ Format.txt ',
ERRORFILE = এন'সি: \ টেম্প \ মুভিএলেন্সর্যাটিংস.টেক্সট ') এএস;

এখানে মূল জিনিসটি সন্নিবেশ করানোর জন্য কলাম নির্বাচন করা।


আমি একটি 'অবশ্যই টেবিল পরিবর্তনশীল "@ টেম্পউইথেল্ড টেবিল" সংকলন ত্রুটি বার্তাটি পেতে পারি
atreeon

-5

নির্বাচনের INTO ব্যবহার করার একটি কারণ হ'ল এটি আপনাকে পরিচয় ব্যবহার করতে দেয়:

SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable 
FROM (SELECT name FROM AnotherTable) AS t

এটি কোনও টেবিল ভেরিয়েবলের সাথে কাজ করবে না, যা খুব খারাপ ...


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