2010-04-15 43 views
5

के लिए विफल रहता है मेरे पास एक क्लाइंट एप्लिकेशन है जो एक अस्थायी तालिका बनाता है, अस्थायी तालिका में एक बड़ा सम्मिलित करता है, फिर इसे हटाने से पहले तालिका का उपयोग करके कुछ SQL निष्पादित करता है।ड्रॉप तालिका अस्थायी तालिका

छद्म कोड:

open connection 
begin transaction 
CREATE TABLE #Temp ([Id] int NOT NULL) 
bulk insert 500 rows into #Temp 
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1 
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1) 
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp 

DROP TABLE #Temp 
COMMIT TRANSACTION 
CLOSE CONNECTION 

इस ड्रॉप बयान पर एक त्रुटि के साथ विफल हो रहा है:

, टेबल '#Temp' नहीं छोड़ा जा सकता, क्योंकि यह मौजूद नहीं है या आप की अनुमति नहीं है ।

मैं कल्पना नहीं कर सकता कि यह विफलता पहले किसी और चीज के बिना कैसे हो सकती है, लेकिन मुझे इससे पहले कोई अन्य विफलता दिखाई नहीं दे रही है।

क्या ऐसी कोई चीज है जो मुझे याद आ रही है जिससे ऐसा हो सकता है?

+0

एक सुझाव, बनाने के लिए, थोक डालने ले जाते हैं, और और लेनदेन ब्लॉक के बाहर बयान छोड़ देते हैं। इसका कोई कारण नहीं है या इसे लॉक करने की आवश्यकता नहीं है, क्योंकि कोई अन्य कनेक्शन इसका उपयोग नहीं कर सकता है। –

+0

@ फिलिप केली: यह बुरा विचार नहीं है, मैं देखूंगा कि क्या मैं लेनदेन की लंबाई को सीमित करने के लिए ऐसा कर सकता हूं, लेकिन मैं नहीं देख सकता कि यह समस्या कैसे उत्पन्न होगी – StarBright

+0

बग व्हाइटस्पेस में प्रकट होता प्रतीत होता है । ;) एक पूर्ण रेपो स्क्रिप्ट इस पर अधिक प्रकाश डालेगी। – Aaronaught

उत्तर

5

संभवतः सत्र में कुछ हो रहा है?

तालिका के अस्तित्व के लिए जाँच से पहले गिरा दिया है की कोशिश करें:

IF object_id('tempdb..#Temp') is not null 
BEGIN 
    DROP TABLE #Temp 
END 
+0

मैं यह निर्धारित करने के लिए कुछ उपकरण जोड़ रहा हूं कि तालिका वास्तव में चली गई है, लेकिन इस बीच मैं ऐसा कुछ भी नहीं देख सकता जो इसका कारण बन सकता है। मैंने जो वर्णन किया है उसके अलावा सत्र में कोई एसक्यूएल नहीं होता है और मुझे अन्य बयानों से कोई त्रुटि नहीं मिल रही है – StarBright

2

मुझे लगता है कि आप बिल्कुल तालिका रचना नहीं करते हैं, क्योंकि बयान

CREATE TABLE #Temp ([Id] AS int) 

सही नहीं है। कृपया इसे

CREATE TABLE #Temp ([Id] int) 

और देखें कि यह काम करता है या नहीं।

+0

भ्रम के लिए खेद है, मैं निर्दोषों की रक्षा के लिए टेबल नाम बदल रहा था और मैंने इसे गलत टाइप किया ... वास्तविक तालिका परिभाषा अर्थात् सही है, मैं "temp तालिका ड्रॉप क्यों करें" के लिए प्रश्न – StarBright

6

मैं SQL सर्वर 2005 पर इस परीक्षण किया है, और आप लेन-देन है कि यह बनाया में एक अस्थायी तालिका ड्रॉप कर सकते हैं:

begin transaction 
create table #temp (id int) 
drop table #temp 
commit transaction 

एसक्यूएल सर्वर का कौन सा संस्करण उपयोग कर रहे हैं?

आप पुनर्विचार कर सकते हैं कि आप अस्थायी तालिका क्यों छोड़ रहे हैं। कनेक्शन समाप्त होने पर स्थानीय अस्थायी तालिका स्वचालित रूप से हटा दी जाती है। आमतौर पर इसे स्पष्ट रूप से छोड़ने की आवश्यकता नहीं होती है।

एक वैश्विक अस्थायी तालिका एक डबल हैश (f.e. ##MyTable) से शुरू होती है। लेकिन जब कोई कनेक्शन संदर्भित नहीं होता है तो भी एक वैश्विक अस्थायी तालिका स्वचालित रूप से हटा दी जाती है।

+2

+1 अपडेट कर दूंगा –

2
BEGIN TRAN 

IF object_id('DATABASE_NAME..#TABLE_NAME') is not null 
BEGIN 
    DROP TABLE #TABLE_NAME 
END 

COMMIT TRAN 

नोट: अपनी मेज नाम दर्ज करें जहां TABLE_NAME और डेटाबेस नाम यह जहां कहते हैं DATABASE_NAME

संबंधित मुद्दे