2012-10-23 12 views
11

मैं निम्नलिखित विवरण के लिए पारित कर दिया: 'नमूना उत्पाद निर्माता उत्पाद का नाम XYZ - आकार' और मैं केवल इस से मान 'उत्पाद का नाम XYZ' प्राप्त करना चाहते हैं। अगर यह सिर्फ एक पंक्ति थी तो मुझे बस सब्सक्रिप्शन का उपयोग करने में कोई समस्या नहीं होगी लेकिन मेरे पास हजारों रिकॉर्ड हैं और हालांकि प्रारंभिक मूल्य नमूना उत्पाद निर्माता सभी उत्पादों के लिए समान है, उत्पाद का नाम अलग हो सकता है और मुझे कुछ भी नहीं चाहिए हाइफ़न।अमान्य लंबाई पैरामीटर LEFT या SUBSTRING समारोह

क्या मैं अब तक इस सवाल के शीर्षक में त्रुटि उत्पन्न किया है है।

SELECT i.Itemid, 
     RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev, 
     CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos 
FROM t_items i 

मैं हो रही है

आप देख सकते हैं, मैं एसक्यूएल बयान अंतिम पंक्ति के लिए मूल्य मिल रहा है लेकिन जब मैं कोशिश करते हैं और 'तर्क डेटा प्रकार varchar-स्ट्रिंग समारोह के तर्क 3 के लिए अमान्य है' प्लगइन को सब्सट्रिंग फ़ंक्शन में प्लग करें मुझे विभिन्न समस्याएं मिलती हैं।

उत्तर

18

संभावनाएं अच्छी हैं कि आपके पास पंक्तियां हैं जहां '-' गायब है, जो आपके कारण बन रहा है त्रुटि। इस प्रयास करें ...

SELECT i.Itemid, 
    SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev, 
FROM t_items i 
+1

त्रुटि की सूचना दी गई है ('तर्क डेटा प्रकार वर्कर स्ट्रिंग फ़ंक्शन के तर्क 3 के लिए अमान्य है') ओपी के SQL कथन के सिंटैक्स पर आधारित है, पुनर्प्राप्त डेटा नहीं। – HABO

+0

केवल पुनर्प्राप्त डेटा में अपमानजनक पंक्ति की तलाश न करें। यह WHERE खंड से पहले अंतर्निहित डेटासेट में हो सकता है। इससे पंक्ति को अपमानित करना मुश्किल हो जाता है लेकिन यह विधि किसी भी घटना में हल करती है। – pghcpa

1

SUBSTRING करने के लिए आपका पहला कॉल SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)) की लंबाई निर्दिष्ट करता है।

आप कोशिश कर सकते हैं:

declare @t_items as Table (ItemId Int Identity, ShortDescription VarChar(100)) 
insert into @t_items (ShortDescription) values 
    ('Sample Product Maker Product Name XYZ - Size') 

declare @SkipLength as Int = Len('Sample Product Maker') 

select ItemId, 
    RTrim(LTrim(Substring(ShortDescription, @SkipLength + 1, CharIndex('-', ShortDescription, @SkipLength) - @SkipLength - 1))) as ProductDescriptionAbbrev 
    from @t_items 
+0

क्या यह एक उत्तर है? मैं इसे काम करने के लिए सभी तरह की चीजों की कोशिश कर रहा हूं। आदर्श रूप में मेरे पास पिछले बयान के तीसरे तर्क के रूप में charindexpos होगा लेकिन यह भी काम नहीं करता था। – brianhevans

1

तुम भी बाहर Sample Product Maker पाठ पट्टी सकता है और वहाँ से जाना:

SELECT RTRIM(LEFT(
    LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', '')), 
     CHARINDEX('-', LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', 
    ''))) - 1)) 
AS ShortDescription 
+0

यह मुझे एक ही समस्या का सामना करता है जो मैंने पहले किया था और यह वास्तव में नहीं है कि मैं क्या पूछ रहा था .... – brianhevans

+1

नहीं, ऐसा नहीं है। यह आपको सही परिणाम देता है। आपकी मूल समस्या पहले सब्सट्रिंग के तीसरे पैरा के लिए int की बजाय स्ट्रिंग का उपयोग कर रही थी। और, स्थिति 25 के बजाय 22 – GilM

+0

इसका जवाब से शुरू वास्तव में आधारित था मेरे तार में से कुछ भी नहीं था कि एक "-" तो मैं स्ट्रिंग के लिए एक नकारात्मक मूल्य लौट रहा था और उस काम नहीं करेगा। यह बहुत बुरा है कि एक बेहतर त्रुटि वर्णनकर्ता था।धन्यवाद – brianhevans

0

लगता है जैसे आप कुछ इस तरह चाहते हैं (22, 25 नहीं):

SELECT i.Itemid, 
     RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription)-22))) AS ProductDescriptionAbbrev, 
     CHARINDEX('-', i.ShortDescription)-22 as charindexpos 
FROM t_items i 
1

समस्या यह है कि SUBSTRING करने के लिए अपने बाहरी कॉल तीसरे पैरामीटर में भीतरी SUBSTRING कॉल से एक चरित्र डेटा प्रकार पारित कर दिया जा रहा है।

            +--This call does not return an integer type 
SELECT i.Itemid,         V 
    RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev, 
    CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos 
FROM t_items i 

तीसरा पैरामीटर आपके इच्छित लंबाई तक मूल्यांकन करना चाहिए। शायद आप LEN(SUBSTRING(...)) मतलब था?

0

आप चाहते हैं:

LEFT(i.ShortDescription, isnull(nullif(CHARINDEX('-', i.ShortDescription),0) - 1, 8000)) 

ध्यान दें कि एक अच्छा अभ्यास nullif(...,0) साथ charindex(...) की और patindex(...) के रैप करने के लिए, और फिर नल मामले को संभाल अगर वांछित है (कभी कभी अशक्त सही परिणाम, इस में है अगर हम चाहते हैं कि हम सभी पाठ चाहते हैं तो हम isnull(...,8000) चाहते हैं)।

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