原來效果:
fName Scroe 王某某 101 , 102 , 109 李某某 102 , 103 王某某 103 李某某 李某某 101 , 102 , 103 王某某 222
執行后效果:
name score 李某某 101 李某某 102 李某某 103 王某某 101 王某某 102 王某某 103 王某某 109 王某某 222
--基礎數據表創建

IF OBJECT_ID ( ' Test1 ' ) > 0 DROP TABLE dbo.Test1 CREATE TABLE Test1 ( fName NVARCHAR ( 10 ) , Scroe VARCHAR ( 50 ) ); INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 王某某 ' , -- fName - nvarchar(10) ' 101,102,109 ' -- Scroe - varchar(50) ) INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 李某某 ' , -- fName - nvarchar(10) ' 102,103 ' -- Scroe - varchar(50) ) INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 王某某 ' , -- fName - nvarchar(10) ' 103 ' -- Scroe - varchar(50) ) INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 李某某 ' , -- fName - nvarchar(10) '' -- Scroe - varchar(50) ) INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 李某某 ' , -- fName - nvarchar(10) ' 101,102,103 ' -- Scroe - varchar(50) ) INSERT dbo.Test1 ( fName, Scroe ) VALUES ( N ' 王某某 ' , -- fName - nvarchar(10) ' 222 ' -- Scroe - varchar(50) ) SELECT * FROM Test1 -- DECLARE @Scroe VARCHAR(max)
--創建分隔函數

1 IF OBJECT_ID ( ' getSplitResult ' ) > 0 2 DROP FUNCTION getSplitResult 3 GO 4 5 /* 6 分隔函數 7 8 */ 9 10 CREATE FUNCTION dbo.getSplitResult 11 ( 12 @SourceObject VARCHAR ( MAX ) , -- 源對象 13 @Split VARCHAR ( 1 ) = ' , ' -- 分隔參數 14 ) 15 -- 返回一個表 16 RETURNS @tb TABLE ( score VARCHAR ( 10 ) ) 17 AS 18 BEGIN 19 -- 不含分隔符 20 IF CHARINDEX ( @Split , @SourceObject ) = 0 21 INSERT @tb 22 ( score ) 23 VALUES ( @SourceObject -- score - varchar(10) 24 ); 25 26 WHILE ( CHARINDEX ( @Split , @SourceObject ) > 0 ) 27 BEGIN 28 -- 插入數據 29 INSERT @tb 30 ( score 31 ) 32 VALUES ( SUBSTRING ( @SourceObject , 0 , 33 CHARINDEX ( @Split , @SourceObject )) -- score - varchar(10) 34 ); 35 36 SET @SourceObject = RIGHT ( @SourceObject , 37 LEN ( @SourceObject ) 38 - CHARINDEX ( @Split , @SourceObject )) 39 40 IF ( CHARINDEX ( @Split , @SourceObject ) = 0 41 AND LEN ( @SourceObject ) <> 0 42 ) 43 INSERT @tb 44 ( score ) 45 VALUES ( @SourceObject -- score - varchar(10) 46 ); 47 END 48 49 RETURN 50 END 51
--創建存儲過程

IF OBJECT_ID ( ' sp_SplitResult ' ) > 0 DROP PROC sp_SplitResult GO CREATE PROC sp_SplitResult AS BEGIN -- 聲明一個表 SET NOCOUNT ON DECLARE @tb TABLE ( name VARCHAR ( 20 ) , score VARCHAR ( 10 ) ) DECLARE @name VARCHAR ( 20 ) = '' , @SourceObject VARCHAR ( MAX ) -- 創建游標 DECLARE cursor_tb CURSOR FAST_FORWARD FOR ( SELECT fName , Scroe FROM dbo.Test1 WHERE Scroe <> '' ) OPEN cursor_tb FETCH NEXT FROM cursor_tb INTO @name , @SourceObject ; WHILE @@FETCH_STATUS = 0 BEGIN INSERT @tb SELECT @name , score FROM dbo.getSplitResult( @SourceObject , ' , ' ) FETCH NEXT FROM cursor_tb INTO @name , @SourceObject END CLOSE cursor_tb DEALLOCATE cursor_tb SELECT DISTINCT * FROM @tb END -- EXEC sp_SplitResult
--執行結果
EXEC
sp_SplitResult
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
