2012-10-31 20 views
6

संभव डुप्लिकेट:
Turning a Comma Separated string into individual rowsस्प्लिट मूल्यों

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

reference name       subjects  subjectstitle 
LL9X81MT Making and Decorating Pottery F06,F27,F38  NULL 

मैं अल्पविराम के पर विषयों क्षेत्र ट्रिम और तीन पंक्तियों पर जानकारी नकल इतना डेटा के रूप में निम्नानुसार किया जाएगा की जरूरत है।

reference name       subjects  subjectstitle 
LL9X81MT Making and Decorating Pottery F06  NULL 
LL9X81MT Making and Decorating Pottery F27  NULL 
LL9X81MT Making and Decorating Pottery F38  NULL 

मैं इन एसपी के सेटअप के लिए एमएस एसक्यूएल सर्वर 2008 का उपयोग कर रहा हूं और विषयों के क्षेत्र को विभाजित करने के तरीके पर कुछ मदद की ज़रूरत है।

धन्यवाद,

+0

डेटा उस प्रारूप में कैसे मिलता है? क्या आप इसे पहले स्थान पर ठीक से वापस नहीं कर सकते? – podiluska

उत्तर

14

आप इस के समान तालिका-मान विभाजन समारोह में किसी प्रकार का उपयोग करना चाहते हैं जाएगा: yourtable साथ शामिल होने के लिए

create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))  
returns @temptable TABLE (items varchar(MAX))  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return 
end; 

फिर आप outer apply उपयोग कर सकते हैं:

select t1.reference, 
    t1.name, 
    t1.subjectstitle, 
    i.items subjects 
from yourtable t1 
outer apply dbo.split(t1.subjects, ',') i 

इस तरह के परिणाम देने:

| REFERENCE |       NAME | SUBJECTSTITLE | SUBJECTS | 
------------------------------------------------------------------------ 
| LL9X81MT | Making and Decorating Pottery |  (null) |  F06 | 
| LL9X81MT | Making and Decorating Pottery |  (null) |  F27 | 
| LL9X81MT | Making and Decorating Pottery |  (null) |  F38 | 

SQL fiddle with Demo

देखें आप एक विभाजन समारोह के बिना ऐसा करना चाहते हैं, तो आप CTE उपयोग कर सकते हैं:

;with cte (reference, name, subjectstitle, subjectitem, subjects) as 
(
    select reference, 
    name, 
    subjectstitle, 
    cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) subjectitem, 
     stuff(subjects, 1, charindex(',',subjects+','), '') subjects 
    from yourtable 
    union all 
    select reference, 
    name, 
    subjectstitle, 
    cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) , 
    stuff(subjects, 1, charindex(',',subjects+','), '') subjects 
    from cte 
    where subjects > '' 
) 
select reference, name, subjectstitle, subjectitem 
from cte 

देखें SQL Fiddle with Demo

+0

+1: आप * बाहरी आवेदन के साथ बेहतर रखा जा सकता है, हालांकि ... – MatBailie

+0

@Dems आप शायद सही हैं, सुधार के लिए धन्यवाद अपडेट किया गया है। – Taryn

+0

इस बोराड पर पहले से ही एक विषय है और ऐसा लगता है कि वहां http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows – Jester

9

यह एक विभाजन समारोह के बिना करना होगा

SELECT T1.reference, T1.name, T2.my_Splits AS subjects, T1.subtitile 
FROM 
(
    SELECT *, 
    CAST('<X>'+replace(T.subjects,',','</X><X>')+'</X>' as XML) as my_Xml 
    FROM [yourTable] T 
) T1 
CROSS APPLY 
( 
SELECT my_Data.D.value('.','varchar(50)') as my_Splits 
FROM T1.my_Xml.nodes('X') as my_Data(D) 
) T2 
+2

बहुत अच्छा। बहुत अच्छा काम करता है। – smoore4

+0

यह बहुत अच्छा है। क्या विभाजन मूल्यों के साथ जाने के लिए अनुक्रम संख्या भी जोड़ने का कोई तरीका है? – aaaantoine

+0

मुझे लगता है कि यह पता लगाया। टी 2 में "my_splits" के ऊपर एक अतिरिक्त कॉलम जोड़ें: '' 'row_number() over (my_data.D द्वारा ऑर्डर) sequence_num के रूप में,' '' – aaaantoine

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