原來效果:
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

