T-SQL:与字符串连接相反-如何将字符串拆分为多个记录
技术问答
444 人阅读
|
0 人回复
|
2023-09-14
|
我想知道您将如何解决相反的问题:将逗号分隔的字符串拆分为数据行:
4 _/ `5 P: m/ ]! W! z/ d可以说我有表:
# N: _: p" U1 W. d. OuserTypedTags(userID,commaSeparatedTags) 'one entry per user8 F* e3 O7 c. s
tags(tagID,name)
! N. j, v* o8 t$ l
2 f, r' e' t) r并想将数据插入表中9 \. w! G! H4 d. ^6 {( i4 a
userTag(userID,tagID) 'multiple entries per user
: g4 ~) S: ~ V
. Z6 Y% q0 T# }9 c0 O* W解决方案:* Q, S5 b$ N, T0 ?2 m) ]. J
. K0 q6 l" u4 ?7 K
6 m4 O' H% s. T# }' P( U$ X
- q3 B2 X! [7 j& Q/ D 这个问题的解决方案记录在这里,包括这个小gem:7 w( R! W' m6 @* w) e
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
5 L2 ]* X5 O0 n8 O1 lRETURNS table b+ h. E3 n: S# Y) T+ b
AS! d2 p" M: ?% O
RETURN (, E- Q0 _- N S9 X. t& w
WITH Pieces(pn, start, stop) AS (
# S8 \5 t) O! X* F+ D7 g+ t SELECT 1, 1, CHARINDEX(@sep, @s)/ s3 a7 ] ~4 _% d# W$ d3 B% c
UNION ALL0 j# o7 h6 C+ _: m; u, y$ V
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)" e7 Y' N' t# C3 L" J
FROM Pieces2 I i7 H5 H/ t1 ]+ g B7 }& V
WHERE stop > 0+ |4 F O2 L9 s/ T$ W5 R a
)
. e; @" b0 P# M/ l* e' ]* r% p; m. ?% N SELECT pn,
+ t. }9 O4 i5 ~8 y6 _) P) Q SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
8 L) A" l4 G) F. u2 N FROM Pieces8 X4 \$ E7 k$ O* C
) |
|
|
|
|
|