sqlserver:表中一列爲分隔符分割的多個人名,添加一列存儲每個人名的id用逗號分割

表中的數據是歷史數據,ConsultorI列是人名的拼接,表中原本沒有存儲對應人名的id列ConsultorID,現添加一列ConsultorID,如圖所示

11

對應的人名的id表是tblMember如圖

11

現在問題來了,怎麼用sqlserver把Consultor中存儲的人名轉換爲對應的id,並用逗號分割存儲到ConsultorID中呢?

因爲sqlserver沒有數組的概念

我的思路是:

 

--創建臨時表放tblLatentStudent中的信息
CREATE TABLE #tb
    (
      SerialNo INT ,
      Consultor  VARCHAR(MAX) ,
      culomnsxml XML DEFAULT NULL
    )

--中間臨時表存放SerialNo和切割後的Consultor字段
CREATE TABLE #temp
    (
      SerialNo INT ,
      Consultor VARCHAR(MAX) 
    )
--中間臨時表存放tblMember表中諮詢老師id和諮詢老師名name
CREATE TABLE #result
    (
      id INT ,
      name VARCHAR(50) 
    )
    --最終表存放學生號SerialNo,和對應老師的名字Consultor和id (ConsultorID)
    CREATE TABLE #resultend
    (
     SerialNo INT ,
      Consultor VARCHAR(100) ,
      ConsultorID VARCHAR(50) 
    )
    
 insert into #tb(SerialNo,Consultor) select SerialNo,Consultor from tblLatentStudent



UPDATE  #tb
SET     culomnsxml = CONVERT(XML , '<root><v>' + REPLACE(a.Consultor , '/' , '</v><v>') + '</v></root>')
FROM    #tb a
SELECT SerialNo , Consultor,culomnsxml FROM #tb

INSERT  INTO #temp ( SerialNo , Consultor )
        SELECT  SerialNo , cx
        FROM    #tb a
                CROSS APPLY ( SELECT C.v.value ('.' , 'nvarchar(100)') cx FROM a.culomnsxml.nodes ('/root/v') C( v)
                            ) b   
--刪除Consultor爲空的行
DELETE FROM #temp WHERE Consultor=''
--插入表 tblMember的id和名字     
 INSERT  INTO #result ( id,name )
        (SELECT id,name
        FROM    tblMember   )  
         SELECT* FROM #result
INSERT  INTO #resultend ( SerialNo,Consultor,ConsultorID )(
        SELECT a.SerialNo,a.Consultor,b.id
        FROM    #temp a
    -- INNER   JOIN #result b ON a.Consultor=b.name
   LEFT JOIN #result b ON a.Consultor=b.name
   )
SELECT  *
FROM    #resultend  
DROP TABLE #tb
DROP TABLE #temp
DROP TABLE #result
DROP TABLE #resultend
<pre class="sql" name="code">SELECT * FROM	#resultend
declare @t table(SerialNo int,ConsultorID varchar(50))--定義結果集表變量   
--定義遊標並進行合併處理  
 declare my_cursor cursor local for 
 select SerialNo , ConsultorID from #resultend  
 declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
 open my_cursor  
 fetch my_cursor into @id , @value  
 select @id_old = @id , @s=''  
 while @@FETCH_STATUS = 0  
begin  
  if @id = @id_old  
   select @s = @s + ',' + cast(@value as varchar)
     else  
        begin  
             insert @t values(@id_old , stuff(@s,1,1,''))  
     select @s = ',' + cast(@value as varchar) , @id_old = @id 
         end  
           fetch my_cursor into @id , @value  
         END  
         insert @t values(@id_old , stuff(@s,1,1,''))  
         close my_cursor  
         deallocate my_cursor  
          select * from @t 
UPDATE dbo.tblLatentStudent SET ConsultorID=a.a2
FROM (SELECT SerialNo AS a1 ,ConsultorID AS a2 FROM @t)AS a
WHERE dbo.tblLatentStudent.SerialNo=a.a1
SELECT ConsultorID,Consultor,* FROM tblLatentStudent 
          drop table #resultend 



 

 

 

 

 

發佈了32 篇原創文章 · 獲贊 16 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章