表中的數據是歷史數據,ConsultorI列是人名的拼接,表中原本沒有存儲對應人名的id列ConsultorID,現添加一列ConsultorID,如圖所示
對應的人名的id表是tblMember如圖
現在問題來了,怎麼用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