2013-05-20 6 views
6

मेरी समस्या एक निष्पादन में तालिका चर का उपयोग कर रही है।तालिका चर का उपयोग कर गतिशील एसक्यूएल - टीएसएल

declare @sort_col nvarchar(1000) = 'itm_id' 
declare @sort_dir nvarchar(4) = 'desc' 
declare @filters nvarchar(1000) = ' and itm_name like ''%aa%''' 

declare @temp table 
(
itm_id int 
) 

insert into @temp 
EXEC('select itm_id from Tblitm where itm_name not like ''%aa%''') 

EXEC('select * from (select (ROW_NUMBER() OVER (ORDER BY '[email protected]_col+' '[email protected]_dir+')) row_num, * FROM (select itm_id, itm_name, 
dbo.fnItmsHistory(itm_id) itm_history 
     from dbo.Tblitm as itm 
     left outer join '[email protected]+' as temp on itm.itm_id = temp.itm_id 
     where itm_id=itm_id and temp.itm_id = null '[email protected]+') as x) as tmp') 

यह अदिश चर "@temp" घोषित करना चाहिए कहते हैं जब अस्थायी तालिका घोषित किया जाता है मैं मूल अस्थायी तालिका का उपयोग करने की कोशिश की और यह काम किया, लेकिन मैं समस्या नहीं थी जब मेरी इकाई model.So अपडेट करने का प्रयास है वहाँ किसी भी इस समस्या के लिए समाधान?

नोट: मुझे निष्पादन का उपयोग करना चाहिए क्योंकि फ़िल्टर में मैं जहां खंड के लिए स्ट्रिंग स्टोर करता हूं।

+2

@temp के बजाय #temp का उपयोग करें और केवल एक चर नाम के इलाज के बजाय EXEC() में संदर्भ #temp का संदर्भ लें। –

+0

देखें [परिवर्तनीय तालिका कथन SQL सर्वर में गतिशील डालने] (http://stackoverflow.com/questions/5196434/dynamic-insert-into-variable-table-statement-sql-server) –

+0

@AaronBertrand मैंने क्वेरी को कार्यात्मक बना दिया कि, लेकिन मुझे अपने इकाई मॉडल को अपडेट करते समय समस्याएं थीं इसलिए मुझे डर है कि मैं उस फिक्स का उपयोग नहीं कर सकता। – Aleks

उत्तर

0

समाधान के लिए मैं एक अस्थायी तालिका का इस्तेमाल किया था और फिर मेरी संग्रहीत प्रक्रिया की शुरुआत पर मैं EF can't infer return schema from Stored Procedure selecting from a #temp table anwser से अगर हालत इस्तेमाल किया।

यह मुझे लगता है कि इस परिदृश्य के लिए यह सबसे अच्छा समाधान है।

1

गतिशील कथन के अंदर तालिका चर को स्थानांतरित करने का प्रयास करें।

EXEC(' 
declare @temp table 
(
itm_id int 
) 
insert into @temp 
select itm_id from Tblitm where itm_name not like ''%aa%'' 
select * from (select (ROW_NUMBER() OVER (ORDER BY '[email protected]_col+' '[email protected]_dir+')) row_num, * FROM (select itm_id, itm_name, 
dbo.fnItmsHistory(itm_id) itm_history 
     from dbo.Tblitm as itm 
     left outer join @temp as temp on itm.itm_id = temp.itm_id 
     where itm_id=itm_id and temp.itm_id = null '[email protected]+') as x) as tmp') 
+0

यह एक समाधान है जो काम करता है, लेकिन मैं इसे एक समाधान के रूप में उपयोग नहीं कर सकता, यह क्वेरी को काफी हद तक धीमा कर देता है। – Aleks

+0

@Aleks आपको किसी भी प्रकार की temp तालिका की आवश्यकता क्यों है, क्यों उप-क्वेरी के साथ शामिल न हों 'Tblitm से itm_id का चयन करें जहां itm_name' '% aa%' '' 'पसंद नहीं है? – Magnus

+0

मैंने जो प्रश्न लिखा है वह एक उदाहरण है जिसमें मेरे पास बहुत अधिक जटिल क्वेरी है और जब मैं इसे निष्पादित करता हूं तो यह एक अस्थायी तालिका का उपयोग करने से बहुत अधिक समय लेता है। – Aleks

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