http://topic.csdn.net/u/20090406/18/f6fd915f-dbe7-48bd-a6ac-1f7d32abd66e.html

解决方案 »

  1.   

    /*
    表TB
    QID Answer
    1  1,3,4,5,
    2  22,23
    3  33,35,38,39
    4  8轉換成
    表TB
    QID Answer
    1  1
    1  3
    1  4
    1  5
    2  22
    2  23
    3  33
    3  35
    3  38
    3  39
    4  8
    */create table #TB(QID int , Answer varchar(50))
    insert into #TB
    SELECT 1, '1,3,4,5' UNION ALL 
    SELECT 2, '22,23' UNION ALL
    SELECT 3, '33,35,38,39' UNION ALL 
    SELECT 4, '8'select * from #tb
    /*
    QID Answer
    1 1,3,4,5
    2 22,23
    3 33,35,38,39
    4 8
    */
    --1. sql 2K
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b 
    --(8000 行受影响)
    SELECT A.QID, SUBSTRING(A.Answer, B.ID, CHARINDEX(',', A.Answer + ',', B.id) - B.id) Answer
    FROM #TB A, # B 
    WHERE SUBSTRING(',' + A.Answer, B.id, 1) = ',' 
    /*
    QID Answer
    1 1
    1 3
    1 4
    1 5
    2 22
    2 23
    3 33
    3 35
    3 38
    3 39
    4 8
    */
    DROP TABLE # --2. sql 2005 
    SELECT A.QID, B.value 
    FROM( 
        SELECT QID, Answer = CONVERT(xml,' <root> <v>' + REPLACE(Answer, ',', ' </v> <v>') + ' </v> </root>') FROM #TB 
    )A 
    OUTER APPLY( 
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.Answer.nodes('/root/v') N(v) 
    )B 
    /*
    QID value
    1 1 
    1 3 
    1 4 
    1 5 
    2 22 
    2 23 
    3 33 
    3 35 
    3 38 
    3 39 
    4 8 
    */
    drop table #TB