मैं SQL- सर्वर में टेबल चर कैसे छोड़ सकता हूँ? क्या मुझे भी ऐसा करना चाहिए?


123

मेरे पास एक स्क्रिप्ट में एक टेबल चर है (संग्रहीत प्रक्रिया नहीं)। दो सवाल:

  1. मैं तालिका चर को कैसे गिराऊं? ड्रॉप टेबल @varName एक "गलत snytax" त्रुटि देता है।
  2. क्या मुझे हमेशा ऐसा करना चाहिए? मुझे लगता है कि यह एक अच्छा अभ्यास है। क्या कभी इस तरह की छोटी स्क्रिप्ट के लिए वास्तव में आवश्यक है?

यहाँ मेरा कोड है:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

आप उन्हें स्वयं ड्रॉप नहीं कर सकते, इसलिए आपके प्रश्न का दूसरा भाग लागू नहीं होता है।
मार्टिन स्मिथ

जवाबों:


189

टेबल चर स्वचालित रूप से स्थानीय और स्वचालित रूप से हटा दिए जाते हैं - आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।


17
+1 - यदि आप चाहते थे तो भी आप उन्हें नहीं छोड़ सकते - वे तब तक बने रहते हैं जब तक सत्र खुला रहता है, किसी अन्य चर की तरह। लेन-देन से भी वे अप्रभावित रहते हैं।
जेएनके

10
@JKK उनके बारे में इंगित करते हैं कि लेनदेन से अप्रभावित रहना महत्वपूर्ण है, आप डेटा को होल्ड करने के लिए टेबल चर का उपयोग कर सकते हैं और रोलबैक में त्रुटि के कारण लॉग टेबल पर लिख सकते हैं।
HLGEM

3
नहीं, यह समान नहीं है। अस्थायी टेबल लेनदेन में भाग लेते हैं।
पॉल पेर्गेन

न ही वे सीटीई के समान हैं।
होगन

आप उन्हें छोड़ नहीं सकते हैं लेकिन आप उन्हें 'डिलीट @projectList' हटा सकते हैं;)
आरके शर्मा

29

टेबल वेरिएबल सिर्फ इंट या वर्चर वैरिएबल की तरह होते हैं।

आपको उन्हें छोड़ने की आवश्यकता नहीं है। उनके पास int या varchar चर के समान स्कोप नियम हैं

एक चर का दायरा Transact-SQL कथनों की श्रेणी है जो चर का संदर्भ दे सकता है। एक चर का दायरा उस बिंदु से रहता है जिसे यह बैच के अंत तक घोषित किया जाता है या संग्रहीत प्रक्रिया जिसमें इसे घोषित किया जाता है।


1
क्या आप जानते हैं कि कार्यक्षेत्र से बाहर जाने पर टेबल चर द्वारा बनाए गए टेम्पर्ड ऑब्जेक्ट साफ हो जाते हैं? या सर्वर उन्हें साफ करने से पहले सत्र बंद होने तक इंतजार करता है?
स्ट्रिपिंगवर्यर

21

अगर कोई और व्यक्ति इस पार आता है ... और आपको वास्तव में इसे गिराने की आवश्यकता है जैसे कि एक लूप में, आप बस तालिका चर से सभी को हटा सकते हैं:

DELETE FROM @tableVariableName

7

लेकिन आप सभी इस बात का उल्लेख करना भूल गए, कि यदि एक परिवर्तनशील तालिका का उपयोग एक लूप के भीतर किया जाता है, तो उसे लूप के भीतर फिर से डेटा के साथ लोड करने से पहले खाली (@ हटाएं) की आवश्यकता होगी।


3

TempTables की तरह ही, TempDB में एक स्थानीय टेबल चर भी बनाया गया है। टेबल चर का दायरा बैच, संग्रहीत प्रक्रिया और स्टेटमेंट ब्लॉक है जिसमें यह घोषित किया गया है। उन्हें प्रक्रियाओं के बीच मापदंडों के रूप में पारित किया जा सकता है। जब आप उस सत्र को बंद कर देते हैं, जिस पर आप उन्हें बनाते हैं तो वे स्वचालित रूप से हटा दिए जाते हैं।


# टैम्प टेबल @table वैरिएबल की तरह नहीं है, यह पैच या स्कोप के खत्म होने के बाद अपने आप नहीं गिरता है, यह स्वचालित रूप से तभी गिराया जाता है जब इसे स्टोर की गई प्रक्रिया के अंदर बनाया गया हो और स्टोर की गई प्रक्रिया समाप्त हो गई हो
Abou-Emish

1

यहाँ एक समाधान है

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

SQL सर्वर 2014 Christophe पर ठीक काम करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.