2011-03-29 17 views
7
Select 
Distinct 
    REPLACE(REPLACE(REPLACE(REPLACE(Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') AS Department 
From 
    Inv WITH(NOLOCK) 

मैं सोच रहा था क्योंकि मैं एक जूनियर ईटीएल अभियंता हूं और अच्छी आदतें विकसित करना चाहता हूं।एसक्यूएल -08: क्या एकाधिक बयान एक खराब अभ्यास है/क्या इस प्रश्न को लिखने का कोई और तरीका है?

स्पष्ट रूप से यह कई परिस्थितियों में और भी अधिक हो सकता है।

+0

मैं एमएस एक्सेस टेबल में एकाधिक प्रतिस्थापन का प्रयास करने के लिए आपके कोड का एक संस्करण उपयोग कर रहा हूं। यह चलता है (बिना किसी त्रुटि संदेश पॉप अप), लेकिन मेरे प्रतिस्थापन क्षेत्र में (आपके 'विभाग' से मेल खाता है, मुझे '# त्रुटि' वापस आती है। कोई विचार क्यों? यह बहुत अच्छा हो सकता है कि मुझे इसे एक अलग के रूप में पोस्ट करना चाहिए सवाल। –

उत्तर

3

आप एसक्यूएलसीएलआर और रेगेक्स का उपयोग कर बेहतर हो सकते हैं। http://blogs.msdn.com/b/sqlclr/archive/2005/06/29/regex.aspx

निश्चित रूप से यह अधिक रखरखाव और लचीला हो सकता है।

जहां तक ​​प्रदर्शन होता है, आपको आम तौर पर अंतर्निहित कार्यों को हरा करना मुश्किल लगता है, लेकिन कई REPLACE संचालन के साथ, सीएलआर इसे बेहतर प्रदर्शन कर सकता है - आपको बेंचमार्क करना होगा।

मुझे लगता है कि आपने कहा है कि आप एसएसआईएस में ऐसा कर रहे हैं - उस स्थिति में, आप अपने डेटा प्रवाह के भीतर कई अन्य संभावित विधियों का उपयोग कर सकते हैं, जिनमें स्क्रिप्ट कार्य और उन लोगों में रेगेक्स शामिल हैं। एक सामान्य नियम के रूप में, आपको अपने द्वारा किए जा रहे प्रत्येक ऑपरेशन का आकलन करने और यह तय करने की आवश्यकता है कि यह क्वेरी में किया जाना चाहिए जो डेटा प्रवाह में डेटा डेटा प्रवाह में लाता है। कुछ ऑपरेशन स्रोत पर (फ़िल्टरिंग की तरह) करने के लिए बेहतर हो सकते हैं, लेकिन अन्य (जैसे समेकन), डेटाफ्लो में बेहतर किया जा सकता है, खासकर यदि वे किसी भी प्रकार के चल रहे डेटा के साथ राज्य में हैं।

5

नेस्टेड प्रतिस्थापन ठीक है, लेकिन घोंसले के स्तर के रूप में आपके कोड की पठनीयता बढ़ जाती है। अगर मेरे पास प्रतिस्थापित करने के लिए बड़ी संख्या में वर्ण हैं तो मैं नीचे तालिका संचालित दृष्टिकोण की तरह कुछ क्लीनर का चयन करूंगा।

declare @Category varchar(25) 
    set @Category = 'ABC & DEF/GHI, LMN OP' 
    -- nested replace 
    select replace(replace(replace(replace(@Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') as Department 

    -- table driven 
    declare @t table (ReplaceThis varchar(10), WithThis varchar(10)) 
    insert into @t 
     values (' & ', '-'), 
       ('/', '-'), 
       (', ', '-'), 
       (' ', '-') 

    select @Category = replace(@Category, ReplaceThis, isnull(WithThis, ''))      
    from @t 
    where charindex(ReplaceThis, @Category) > 0; 

    select @Category [Department] 
संबंधित मुद्दे