sql server - अस्थायी तालिका बनाने से पहले जांचें कि क्या कोई अस्थायी तालिका मौजूद है या हटाएं




sql-server sql-server-2005 (9)

pmac72 बैच में क्वेरी को तोड़ने और ALTER का उपयोग करने के लिए GO का उपयोग कर रहा है।

आप एक ही बैच चला रहे हैं लेकिन इसे बदलने के बाद इसे दो बार चला रहे हैं: ड्रॉ ... बनाएं ... संपादित करें ... ड्रॉप ... बनाएं ..

शायद अपना सटीक कोड पोस्ट करें ताकि हम देख सकें कि क्या हो रहा है।

मैं यह जांचने के लिए निम्न कोड का उपयोग कर रहा हूं कि अस्थायी तालिका मौजूद है या नहीं, यदि तालिका दोबारा बनाने से पहले मौजूद है। जब तक मैं कॉलम नहीं बदलता तब तक यह ठीक काम करता है। अगर मैं बाद में एक कॉलम जोड़ता हूं, तो यह "अमान्य कॉलम" कहने में त्रुटि देगा। कृपया मुझे बताएं कि मैं क्या गलत कर रहा हूं।

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

अस्थायी तालिका को 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 का उपयोग कर रहे हैं तो अस्थायी तालिका ड्रॉप करने और इसे फिर से बनाने के लिए नीचे दिए गए वाक्यविन्यास का उपयोग करें। यहां MSDN अधिक जानकारी

वाक्य - विन्यास

ड्रोप टेबल [अगर EXISTS] [डेटाबेस_नाम। [schema_name]। | schema_name। ] table_name [, ... n]

प्रश्न:

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

बयान आदेश का होना चाहिए

  1. तालिका के लिए कथन का विवरण
  2. चले जाओ
  3. कथन का चयन करें।

बीच में 'जाओ' के बिना, पूरी चीज को एक ही स्क्रिप्ट के रूप में माना जाएगा और जब चयन कथन कॉलम की तलाश में है, तो यह नहीं मिलेगा।

'जाओ' के साथ, यह स्क्रिप्ट के हिस्से को 'गो' तक एक सिंगल बैच के रूप में मानेगा और 'जाओ' के बाद क्वेरी में शामिल होने से पहले निष्पादित करेगा।


मुझे लगता है कि समस्या यह है कि निष्पादन को बैचों में अलग करने के लिए आपको बीच में कथन जोड़ना होगा। दूसरी ड्रॉप स्क्रिप्ट यानी 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

मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता।

शायद मैं समस्या को समझ नहीं रहा हूं।

SQL Server 2005 में मेरे लिए निम्न ठीक काम करता है, अतिरिक्त "foo" कॉलम दूसरे चयन परिणाम में दिखाई देता है:

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

मैंने हाल ही में एक डीबीए ऐसा कुछ देखा है:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)


हां, "अमान्य कॉलम" यह त्रुटि "चयन कंपनी, स्टेपिड, फ़ील्डिड, #Results से न्यूकॉलम" पंक्ति से उठाई गई है।

टी-एसक्यूएल चलाने के दो चरण हैं,

सबसे पहले, पार्सिंग, इस चरण में एसक्यूएल सर्वर आपके द्वारा सबमिट किए गए एसक्यूएल स्ट्रिंग के सुधार की जांच करता है, जिसमें टेबल के कॉलम शामिल हैं, और सबसे तेज़ रिट्रिवल के लिए आपकी क्वेरी को अनुकूलित किया गया है।

दूसरा, चल रहा है, डेटा को पुनः प्राप्त कर रहा है।

यदि तालिका # परिणाम मौजूद हैं तो पार्सिंग प्रक्रिया आपके द्वारा निर्दिष्ट कॉलम को मान्य करेगी या नहीं, अन्यथा (तालिका मौजूद नहीं है) पार्सिंग आपके द्वारा निर्दिष्ट कॉलम को पास कर दी जाएगी।


CREATE TABLE #tempTable (id int IDENTITY(1, 1) PRIMARY KEY, name nvarchar(500), value nvarchar(500))    

BEGIN TRY
    DELETE FROM #tempTable

    PRINT 'Table deleted'

END TRY

BEGIN CATCH
    PRINT 'Table does not exist'

END CATCH






alter-table