অস্থায়ী টেবিল তৈরি করার আগে অস্থায়ী টেবিল রয়েছে কিনা তা মুছে ফেলুন এবং তা মুছুন


661

অস্থায়ী টেবিলটি আছে কিনা তা পরীক্ষা করতে আমি নীচের কোডটি ব্যবহার করছি এবং টেবিলটি তৈরি করার আগে আবার উপস্থিত থাকলে তা ফেলে দিন। যতক্ষণ না আমি কলামগুলি পরিবর্তন না করি এটি ঠিক কাজ করে। আমি যদি পরে কোনও কলাম যুক্ত করি তবে এটি "অবৈধ কলাম" বলে ত্রুটি দেবে। আমি কী ভুল করছি দয়া করে আমাকে জানান let

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

select company, stepid, fieldid from #Results

--Works fine to this point

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

select company, stepid, fieldid, NewColumn from #Results

--Does not work

আপনি কলামটি কোথায় যুক্ত করছেন? আপনি কি সঠিক কোডটি পোস্ট করতে পারেন যা আপনাকে একটি ত্রুটি দিচ্ছে?
ম্যাক্রোজ

আমি # ফলাফলগুলি সারণিতে কলামটি যুক্ত করছি। আপনি যদি উপরের কোডটি অনুলিপি করেন এবং প্রথমবার চালিত হন তবে কোনও ত্রুটি পাবেন না। এখন আপনি যদি টেম্প টেবিলটিতে একটি কলাম যুক্ত করেন এবং নির্বাচিত বিবৃতিতে কলামটি যুক্ত করেন তবে এটি বলবে যে কলামটি পাওয়া যায় নি (বা এর মতো কিছু)।
শ্রীধর

22
নিম্নলিখিত প্যাটার্ন ব্যবহার বিবেচনা করুন: BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT। লেনদেন সফল হলে, টেবিলটি সরানো হবে। যদি এটি ব্যর্থ হয়, সারণীটি পাশাপাশি চলে যাবে (যেহেতু এটি লেনদেনের মধ্যে তৈরি হয়েছিল)। যে কোনও ক্ষেত্রে: টেবিলটি ইতিমধ্যে বিদ্যমান কিনা তা খতিয়ে দেখার দরকার নেই।
হেইনজি

1
দেখে মনে হচ্ছে আপনার কেবল GO স্টেটমেন্ট দরকার।
সাম yi

উত্তর:


732

আমি ত্রুটিটি পুনরুত্পাদন করতে পারি না।

সম্ভবত আমি সমস্যাটি বুঝতে পারছি না।

নিম্নলিখিতটি আমার জন্য এসকিউএল সার্ভার ২০০ in-তে অতিরিক্ত কাজ করে, অতিরিক্ত "ফু" কলামটি দ্বিতীয় নির্বাচনের ফলাফলের সাথে উপস্থিত হওয়ার সাথে:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO

1
যদি ওবিজেইসিআইডিআইডি ('টেম্পডিবি .. # ফলাফল') টেবিলটি বাতিল হয় না # ফলাফল` টেবিল তৈরি করুন # ফলাফল (সংস্থার চর (3), স্টেপড আইএনটি) নির্বাচন করুন, # ফলাফল থেকে স্টেপিড এখন তৈরি বিবৃতিতে ফিরে যান এবং একটি যুক্ত করুন ফিল্ডইড অন্তর্ভুক্ত করুন এবং এটিকে চালানোর জন্য কলাম ফিল্ডইডটি শেষের দিকে পরিবর্তন করুন স্টেটমেন্ট নির্বাচন করুন।
শ্রীধর

28
'tempdb..#name'আমার যা প্রয়োজন ছিল ঠিক তা-ই। আমি ব্যবহার করছি 'dbo.#name', একটি বোকা মত। আমি tempdbঅংশটি পেয়েছি , তবে ডাবল ডটসের সাথে কী আছে?
কনরাড.ডিয়ান

77
@ কনরাড.ডিন ডাবল ডট .dbo এর একটি সংক্ষেপণ।
ডয়চচুইড

32
@ ডিটসচিউড এটি আরও সঠিকভাবে বলা যায় যে ডাবল ডট হ'ল ব্যবহারকারীর ডিফল্ট স্কিমা, যা সাধারণত ডিবিও হয় (এটি কোনও দুর্দান্ত ধারণা নয়, ব্যবহারকারীদের জন্য ডিবিওর ডিফল্ট স্কিমা তৈরি করে তবে সাধারণত এটি কীভাবে হয়)
জ্যাকলাম

8
আপনার কোডটি ওপি থেকে এতটাই আলাদা যে আপনার 'পুনরুত্পাদন করতে পারবেন না' বিবৃতি অর্থহীন। আমি আপনার জন্য খুশি যে আপনি এটি অন্যভাবে কাজ করতে পেরেছিলেন।
জেরার্ড ওনিল

85

বিবৃতিটি আদেশের হওয়া উচিত

  1. টেবিলের জন্য বিবৃতি পরিবর্তন করুন
  2. যাওয়া
  3. বিবৃতি নির্বাচন করুন।

এর মধ্যে 'Go' ব্যতীত পুরো বিষয়টিকে একটি একক স্ক্রিপ্ট হিসাবে বিবেচনা করা হবে এবং যখন নির্বাচিত বিবৃতিটি কলামটি সন্ধান করবে, এটি সন্ধান করবে না।

'Go' দিয়ে এটি স্ক্রিপ্টের অংশটিকে 'Go' পর্যন্ত একক ব্যাচ হিসাবে বিবেচনা করবে এবং 'GO' এর পরে ক্যোয়ারিতে যাওয়ার আগে সম্পাদন করবে।


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

2
আমি এই এবং শীর্ষ উত্তরের মধ্যে ভোটের বৈষম্যকে বিশ্বাস করতে পারি না, কারণ কোডটি এতটাই পরিবর্তন করেছিল - কেন তা ব্যাখ্যা না করে - এটি প্রতিক্রিয়া হিসাবে অর্থহীন ছিল।
আন্ডারস্কোর_ডি

63

droppingটেম্প টেবিলটি পুনরায় তৈরি করার পরিবর্তে আপনি truncateএটিকে আবার ব্যবহার করতে পারেন

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

আপনি যদি ব্যবহার করছেন Sql Server 2016বা Azure Sql Databaseতারপরে টেম্প টেবিলটি ফেলে রেখে পুনরায় তৈরি করতে নীচের বাক্য গঠন ব্যবহার করুন। আরও তথ্য এখানে এমএসডিএন

বাক্য গঠন

টেবিলটি ড্রপ করুন [যদি উপস্থিত থাকে] [ডাটাবেস_নাম। [স্কিমা_নাম]। | স্কিমা_নাম। ] টেবিলের নাম [, ... এন]

প্রশ্ন:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )

মনে হচ্ছে truncate/reuseপদ্ধতি অধিক কার্যকরী হবে DROP TABLE IF EXISTSউপর Sql Server 2016এবং Azure Sql Databaseহিসাবে ভাল। এটা কি না?
জেডগ

@prdp আপনি DROP TABLE IF Existsএসকিউএল 2016 বা অ্যাজুরির জন্য পরামর্শ দিচ্ছেন কেন ? এসকিউএল ২০০৮ শুরু করে সিনট্যাক্সটি উপলব্ধ। আপনার উত্তরটিতে এমএসডিএন লিঙ্কটি দেখুন? পারফরম্যান্স ফ্যাক্টর?
হ্যাপিটাউন

4
কিছু মনে করো না. আমি এখন বুঝতে পেরেছি, DROP TABLEএসকিউএল সার্ভার ২০০৮ থেকে সমর্থিত, তবে এই IF EXISTSধারাটি
২০১

1
আমি ব্যবহার করি INTO: ডিবিও থেকে * ইনস্টো #
হিস্টোরিকো

54

আমি মনে করি সমস্যাটি হ'ল ফাঁসিকে ব্যাচগুলিতে আলাদা করার জন্য আপনাকে জিও স্টেটমেন্ট যুক্ত করতে হবে। দ্বিতীয় ড্রপ স্ক্রিপ্ট হিসাবে যেমন IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Resultsএকক ব্যাচের অংশ হয়ে টেম্প টেবিলটি বাদ দেয় না। আপনি দয়া করে নীচের স্ক্রিপ্ট চেষ্টা করতে পারেন।

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

GO

select company, stepid, fieldid from #Results

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

GO

select company, stepid, fieldid, NewColumn from #Results

1
নোট; tempdb..উপরের কোডটি খুব গুরুত্বপূর্ণ। এটিতে আপনার টেম্প টেবিলের নাম আগে থাকা দরকার। কেবল চেকিং OBJECT_ID('#Results')যথেষ্ট নয়। অস্থায়ী টেবিলগুলি টেম্পডিবি ডাটাবেসে সংরক্ষণ করা হয়। প্রতি মাইক্রোসফ্ট: টেম্পডিবি সিস্টেম ডাটাবেস এমন একটি বৈশ্বিক সংস্থান যা এসকিউএল সার্ভারের উদাহরণের সাথে সংযুক্ত বা এসকিউএল ডেটাবেস
আইকোড

ধন্যবাদ, @ আইকোড টেম্প টেবিলগুলি ফেলে দেওয়ার জন্য এটি মূল কী: এটি চালু রাখতে হবে tempdbবা এটি শেষ হবে না।
অ্যালেক্স

37

এটি কোডের একক লাইন দিয়ে সম্পন্ন হতে পারে:

IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;   

1
আমার অবশ্যই এটি অবশ্যই প্রতিদিন দেখতে হবে
আব বনেট

28

এটি আমার জন্য কাজ করেছে: social.msdn.microsoft.com/ Forums / en / transactsql / thread / 02c6da90-954d-487d-a823-e24b891ec1b0?prof=requided

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;

1
শর্তসাপেক্ষ টেবিল ড্রপ জন্য এটি ঠিক ভিন্ন বাক্য গঠন। এটি আকর্ষণীয় তবে ওপির প্রশ্নটি সমাধান করে না এবং এর বেশিরভাগই অপ্রয়োজনীয়। যদি আপনি কেবল OBJECT_ID (N'tempdb .. # ফলাফল ') পরীক্ষা করে থাকেন তবে অবজেক্টটি ইতিমধ্যে বিদ্যমান তা প্রমাণ করার পক্ষে যথেষ্ট।
দাভোস

21

আমার পক্ষ থেকে কেবল সামান্য মন্তব্যটি আমার পক্ষে OBJECT_IDকাজ করে না। এটি সর্বদা এটি ফেরত দেয়

te #tempTable বিদ্যমান নেই

..even যদিও এটা করে বিদ্যমান। আমি সবেমাত্র এটি পৃথক নামের ( _আন্ডারস্কোর দ্বারা পোস্টফিক্সড ) সহ সঞ্চিত করেছি:

#tempTable________

এটি আমার পক্ষে ভাল কাজ করে:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;

6
সতর্কতা: এই কোডটি কোনও থ্রেড দ্বারা তৈরি করা থাকলে কোনও সারণী সনাক্ত করবে। একক # টেম্প টেবিলগুলি পৃথকভাবে থ্রেড / কলার হিসাবে স্টোরেজ করা প্রোকে তৈরি করা হয়, এ কারণেই নামের আন্ডারস্কোরগুলি যাতে থ্রেড / প্রক্রিয়া অনুসারে পৃথক অনুলিপি উপস্থিত থাকে। অবজেক্ট_আইডি বর্তমান থ্রেডের জন্য ঠিক কাজ করা উচিত, যতক্ষণ আপনি এসকিউএল 2005 বা তার পরে থাকেন।
বাইটমাস্টার

12

আপনি যদি এসকিউএল সার্ভারের নতুন সংস্করণ (2016+) ব্যবহার করেন তবে এখন আপনি নীচের বাক্য গঠনটি ব্যবহার করতে পারেন।

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)

1
আমি Incorrect syntax near the keyword 'IF'.
এসএসএমএস

7
@ স্টেটিংজ্যাক কারণ এসকিউএল সিন্ট্যাক্স এসএসএমএস সংস্করণ সম্পর্কিত নয়, তবে এসকিউএল সার্ভার সংস্করণ সম্পর্কিত। IF [NOT] EXISTSদফা SQL সার্ভার 2016 থেকে এটা কোন ব্যাপার না, যা SSMS সংস্করণ আপনি ব্যবহার করছেন পাওয়া যায়।
মাস

10

pmac72 জিও ব্যবহার করে ব্যাচগুলিতে ক্যোয়ারীটি ভাঙ্গতে এবং একটি অলটার ব্যবহার করছে।

আপনি একই ব্যাচটি চালাচ্ছেন তবে এটি পরিবর্তনের পরে এটি দু'বার চালাচ্ছেন: ড্রপ ... তৈরি করুন ... সম্পাদনা করুন ... ড্রপ করুন ... তৈরি করুন ..

সম্ভবত আপনার সঠিক কোডটি পোস্ট করুন যাতে আমরা দেখতে পাচ্ছি যে কী চলছে।


7

আমি ইতিমধ্যে যখন টেম্প টেবিলটি তৈরি করেছি তখন আমি সাধারণত এই ত্রুটিটি আঘাত করি; ত্রুটিগুলির জন্য এসকিউএল স্টেটমেন্টটি যাচাই করে কোডটি "পুরানো" টেম্প টেবিলটি জায়গায় দেখায় এবং পরবর্তী বিবৃতিতে কলামগুলির সংখ্যার উপর একটি মিসকাউন্ট ফেরত দেয়, যেন টেম্প টেবিলটি কখনও বাদ পড়ে নি।

ইতিমধ্যে কম কলামগুলির সাথে একটি সংস্করণ তৈরি করার পরে কোনও টেম্প টেবিলের কলামগুলির সংখ্যা পরিবর্তন করার পরে, টেবিলটি ফেলে দিন এবং তারপরে আপনার ক্যোয়ারি চালাবেন।


6

আমি সম্প্রতি একটি ডিবিএর সাথে এরকম কিছু করতে দেখেছি:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)

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

এটি কার্যকর তবে খারাপ যখন স্মার্ট এবং নিখুঁত সমাধান থাকে তখন আমি শক্ত পথে উত্সাহিত করি না। এছাড়াও, যদিও ওপি 2005 সংস্করণ নির্দিষ্ট করেছে, পুরানো সংস্করণগুলিতে ক্যাচ ব্লক সমর্থিত নয়
dejjub-AIS

এটির সাথে অন্য সমস্যাটি হ'ল চেষ্টা করুন / ক্যাচ বনাম যুক্তি ব্যবহারের আদর্শ। : আপনি এখানে বিতর্ক তার আরও দেখতে পারেন stackoverflow.com/questions/17335217/try-catch-or-if-statement/...
logixologist

3

আমার কোডটি Sourceএমন একটি সারণী ব্যবহার করে যা পরিবর্তিত হয় এবং একটি Destinationটেবিল যা অবশ্যই এই পরিবর্তনের সাথে মেলে।

-- 
-- Sample SQL to update only rows in a "Destination" Table
--  based on only rows that have changed in a "Source" table
--


--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID('tempdb..#tSource') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)

--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID('tempdb..#tDest') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource


--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest

--
-- Make some changes to the Source
--
update #tSource
    Set Col3=19
    Where Col1=1
update #tSource
    Set Col3=29
    Where Col1=2
update #tSource
    Set Col2=38
    Where Col1=3
update #tSource
    Set Col2=48
    Where Col1=4

--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest

--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
    Set Col2=S.Col2,
        Col3=S.Col3,
        Col4=S.Col4
From    (   Select Col1, Col2, Col3, Col4
            from #tSource
            except
            Select Col1, Col2, Col3, Col4
            from #tDest
        ) S
Where #tDest.Col1=S.Col1 

--
-- Look at the tables again to see that
--  the destination table has changed to match
--  the source table.

select *
from #tSource
Select *
from #tDest

--
-- Clean Up
--
drop table #tSource
drop table #tDest

1

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

টি-স্কেল চালানোর দুটি ধাপ রয়েছে,

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

দ্বিতীয়, চলমান, ডেটা পুনরুদ্ধার।

যদি টেবিল # ফলাফলগুলি বিদ্যমান থাকে তবে পার্সিং প্রক্রিয়াটি আপনার নির্দিষ্ট করা কলামগুলি বৈধ কিনা তা পরীক্ষা করবে else


0

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

আমি সর্বদা এটি ধরে রেখেছি কারণ "অবৈধ কলাম" চেকটি ক্যোরি চালানোর আগে পার্সার দ্বারা সম্পন্ন হয়, সুতরাং এটি টেবিলের কলামগুলির উপর ভিত্তি করে এটি নামানোর আগে ..... এবং এটি পিএনবিএসও বলেছিল।

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