回答

收藏

T-SQL:与字符串连接相反-如何将字符串拆分为多个记录

技术问答 技术问答 511 人阅读 | 0 人回复 | 2023-09-14

我想知道您将如何解决相反的问题:将逗号分隔的字符串拆分为数据行:
1 R' p; {' x; L/ F' O" T9 |7 I& Z可以说我有表:
$ v3 p0 h+ t: ?- s, E; ]userTypedTags(userID,commaSeparatedTags) 'one entry per user
8 X. Q+ [6 F1 R* dtags(tagID,name)3 s1 E6 Q4 y3 {( r" \

) d5 ^8 f6 F- X! a并想将数据插入表中4 u  Q) s; v- l) P0 h6 e! |( S
userTag(userID,tagID) 'multiple entries per user/ z8 d; e5 Y! D- G7 Q
                * Y. g, m8 j/ e7 S( M0 U6 n0 y
解决方案:
3 |) G* j* y# P1 q                8 q; D, C7 P1 K4 d5 W

; }5 D) l9 ?: Y1 W: Y! p' D) F1 K8 L7 v
                这个问题的解决方案记录在这里,包括这个小gem:
7 ~( [5 X9 ?, K' ?3 u% S. e6 MCREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
% k# c4 |, F' d- c6 X  S# K+ f7 NRETURNS table9 u; k/ i9 @5 @$ @9 ~
AS
# G6 ^+ K( t* D( [2 D4 _RETURN (2 Y: k6 |3 T; W. ]; |! y
    WITH Pieces(pn, start, stop) AS (: n9 q3 H2 ^" q) x- M. d
      SELECT 1, 1, CHARINDEX(@sep, @s)% p; @, \1 H6 G1 ~4 h: v+ H
      UNION ALL
* Z6 C8 C. {5 l0 I8 M6 b$ q+ `      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)% X1 A  m' |- o' Q/ q/ R
      FROM Pieces/ m: s$ x; }" i) A* c
      WHERE stop > 0% K$ B) |  Y% ~: q. F
    )) v1 i: R9 G( |3 `  B: Q
    SELECT pn,( C, s; n$ m/ t8 ]
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
  t: M" H; ^  g& q- c" e5 M4 |0 l    FROM Pieces2 F3 f3 w3 ~; k6 j, K( V) r
  )
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则