2013-08-01 9 views
22

मैं प्राप्त करने के लिए कोशिश कर रहा हूँ:एसक्यूएल अस्थायी तालिका चर

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1  <--- ERROR AT @TEMP.ID 

लेकिन एक त्रुटि

उत्पन्न होने वाली अदिश चर "@temp" घोषित करना चाहिए।

कोई मदद?

+3

'से चुनें * @ टीईएमपी टी से चुनें जहां टी.आईडी = 1' – GriGrim

उत्तर

26

एक तालिका उपनाम @ से शुरू नहीं हो सकता है। तो, @Temp एक और उर्फ ​​देना (या दो भाग पूरी तरह नामकरण बाहर छोड़):

SELECT * 
FROM @TEMP t 
WHERE t.ID = 1; 

इसके अलावा, एक भी बराबर चिह्न पारंपरिक रूप से एक तुलना के लिए एसक्यूएल में प्रयोग किया जाता है।

10

या तो टी जैसे तालिका में एलियास का उपयोग करें और टी.आईडी का उपयोग करें, या केवल कॉलम नाम का उपयोग करें।

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE ID = 1 
7

आप @ ब्रैकेट, तो आप इसे उपयोग कर सकते हैं सीधे

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp values (1,'one'), (2,'two') 

SELECT * FROM @TEMP 
WHERE [@TEMP].[ID] = 1 
3

वहाँ एक अस्थायी तालिका का एक और तरीका

create table #TempTable (
ID int, 
name varchar(max) 
) 

insert into #TempTable (ID,name) 
Select ID,Name 
from Table 

SELECT * 
FROM #TempTable 
WHERE ID = 1 

करें कि आप सही डेटाबेस का चयन कर रहे हैं है।

-4

आपने @TEMP घोषित कर दिया है लेकिन आपके सम्मिलित कथन में @temp का उपयोग किया गया है। केस संवेदनशील परिवर्तनीय नाम।

@temp बदलें

+2

वेरिएबल केस संवेदनशील नहीं हैं। –

-1

@TEMP के रूप में हमेशा की तरह पैरामीटर है कि एक '@' (जैसे @parameter) के साथ शुरू करने का विरोध किया, अस्थायी तालिकाओं एक # (जैसे #tempTable) के साथ शुरू करने की जरूरत है। जैसा कि गौरववेटिया सुझाव देता है, आपको अपनी सामान्य तालिका के रूप में अपनी अस्थायी तालिका घोषित करनी चाहिए, लेकिन इसे @ के बजाय # के साथ नाम दें और यह केवल आपके वर्तमान सत्र में उपलब्ध होगा, और जब आप सत्र बंद करते हैं तो ड्रॉप हो जाएगा। आपके पास एक वैश्विक temp तालिका भी हो सकती है जो ## (उदा। ## globalTempTable) से शुरू होती है जिसका उपयोग सत्रों और बूंदों में किया जा सकता है जब आप इसे बनाए गए सत्र को बंद करते हैं, लेकिन मैंने अभी तक इनमें से किसी एक का उपयोग नहीं किया है।

+1

वास्तव में तालिका चर के साथ ही temp तालिकाओं हैं।ऐसे समय होते हैं जब वे उपयोग करने के लिए बेहतर होते हैं और समय जब temp टेबल उपयोग करने के लिए बेहतर होते हैं। टेम्पलेट टेबल को अनुक्रमित किया जा सकता है और बड़े डेटासेट के लिए बेहतर होता है। तालिका चर अक्सर छोटे डेटा सेट के लिए तेज़ होते हैं और अक्सर एसएसआईएस स्रोत गंतव्यों के लिए संग्रहीत प्रोसेस में उपयोग किए जाते हैं यदि डेटा प्राप्त करने के लिए क्वेरी जटिल है क्योंकि एसएसआईएस कॉलम को नहीं समझ सकता है यदि आप एक temp तालिका का उपयोग करते हैं। टेबल वैरिएबल आवश्यक हैं यदि आप रोलबैक के बाद कुछ डेटा को संरक्षित करना चाहते हैं जैसे डेटा जो आप डालने वाले थे, जिससे विफलता हुई। – HLGEM

+0

ओह, क्षमा करें! इसे पकड़ने के लिए धन्यवाद: मैं सुनिश्चित कर दूंगा कि मुझे पता है कि अगली बार जवाब देने से पहले मैं किस बारे में बात कर रहा हूं। –

0

आपको हैश (#) टेबल का उपयोग करना चाहिए, जिसे आप वास्तव में खोज रहे हैं क्योंकि चर मूल्य केवल उस निष्पादन तक ही रहेगा। उदा। -

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

जब दो से नीचे और दो बयान अलग से निष्पादित होते हैं।

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1 

त्रुटि दिखाई देगी क्योंकि जब आप दूसरी बार क्वेरी के बैच निष्पादित करते हैं तो परिवर्तनीय मान खो जाता है। जब आप कोड का एक संपूर्ण ब्लॉक चलाते हैं तो यह निश्चित रूप से ओ/पी देता है।

हैश तालिका अस्थायी मूल्य को संग्रहीत करने और पुनर्प्राप्त करने का सबसे अच्छा विकल्प है। यह तब तक चलता है जब तक कि अभिभावक सत्र जीवित न हो।

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