SELECT usertName,place from user WHERE placeId=123
上面这条sql语句的结果如下:  usertName                                             place
宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣     水泊梁山----------------我想实现下面的结果,请问,该如何写select语句呢?placeId      place        usertName123          水泊梁山      宋江 
123          水泊梁山      卢俊义 
123          水泊梁山      吴用 
123          水泊梁山      公孙胜 
123          水泊梁山      关胜 
123          水泊梁山      林冲 
123          水泊梁山      秦明 
123          水泊梁山      呼延灼 
123          水泊梁山      花荣 

解决方案 »

  1.   

    参考:
    wufeng4552(水族) 
    http://topic.csdn.net/u/20081218/09/90ea3187-3c38-496e-8fdf-0682b4760fa1.html
      

  2.   

    CREATE TABLE #temp
    (
    placeId int,
    usertName nvarchar(100),
    place nvarchar(10)
    )
    insert #temp
    select 123, N'宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣', N'水泊梁山'
    go
    --SQL:
    SELECT a.*, c.usertName FROM
    (SELECT placeId, place from #temp) a
    CROSS APPLY
    (SELECT usertName = CONVERT(xml,'<root><v>' + REPLACE(usertName, ',', '</v><v>') + '</v></root>') FROM #temp where placeId = a.placeId and place = a.place) B
    outer apply
    (SELECT usertName = N.v.value('.', 'varchar(100)') FROM B.usertName.nodes('/root/v') N(v)) c
    WHERE a.placeId=123
    /*
    placeId place usertName
    123 水泊梁山 宋江
    123 水泊梁山 卢俊义
    123 水泊梁山 吴用
    123 水泊梁山 公孙胜
    123 水泊梁山 关胜
    123 水泊梁山 林冲
    123 水泊梁山 秦明
    123 水泊梁山 呼延灼
    123 水泊梁山 花荣
    */
      

  3.   


    CREATE TABLE #TEMP
    (
        PLACEID INT,
        USERTNAME NVARCHAR(100),
        PLACE NVARCHAR(10)
    )
    INSERT #TEMP
    SELECT 123, N'宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣', N'水泊梁山'
    GOSELECT '123' AS C1,A.PLACE,SUBSTRING(A.USERTNAME,B.NUMBER,CHARINDEX(',',A.USERTNAME+',',B.NUMBER) - B.NUMBER) PART
    FROM #TEMP A,MASTER..SPT_VALUES B
    WHERE B.[TYPE] = 'P' AND B.NUMBER BETWEEN 1 AND LEN(A.USERTNAME)
    AND SUBSTRING(',' + A.USERTNAME,B.NUMBER,1) = ','DROP TABLE #TEMP/*
    C1   PLACE      PART
    ---- ---------- ----------------------------------------------------------------------------------------------------
    123  水泊梁山       宋江
    123  水泊梁山       卢俊义
    123  水泊梁山       吴用
    123  水泊梁山       公孙胜
    123  水泊梁山       关胜
    123  水泊梁山       林冲
    123  水泊梁山       秦明
    123  水泊梁山       呼延灼
    123  水泊梁山       花荣(9 行受影响)
      

  4.   


    create table #T1(placeId nvarchar(5),usertName nvarchar(4000),place nvarchar(20))
    insert #T1 select '123','宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣','水泊梁山' create function [dbo].[m_split](@c varchar(2000),@split varchar(2))  --把字符串截開,生成一個單列的表 
      returns @t table(col varchar(200))   
      as   
        begin   
          while(charindex(@split,@c)<>0)   
            begin   
              insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))   
                set @c = stuff(@c,1,charindex(@split,@c),'')   
            end   
          insert @t(col) values (@c)   
          return   
    enddeclare @usertName as nvarchar(4000)
    declare @placeId as nvarchar(5)
    declare @place as nvarchar(20)
    SELECT @placeId=placeId,@usertName=usertName,@place=place from #T1 WHERE placeId=123
    select @placeId as placeId ,@place as place ,col as usertName from dbo.m_split(@usertName,',')