|
我想知道您将如何解决相反的问题:将逗号分隔的字符串拆分为数据行:
: D5 d3 t- ?5 |4 j) z$ H {+ n可以说我有表:4 |7 v$ k" R, o. i5 S5 l& @2 [! Z
userTypedTags(userID,commaSeparatedTags) 'one entry per user8 f5 ?, _% d, S' ~8 L
tags(tagID,name)
. a9 Z6 u+ O' Q" |9 x M ], |- S! n: _7 b7 E
并想将数据插入表中
+ B( r! S& e/ R4 OuserTag(userID,tagID) 'multiple entries per user
, l) A9 C$ a H5 s) {% x s, V
. H9 B( i8 H3 @, D# U0 ~6 e, F6 I4 {解决方案:( y) C/ E; F; |. {' t
1 u( \# v( X; s% s" [* s/ e
& z5 C1 @! n- g6 t, o6 n- D: }' Q; H! R' x) Z: c
这个问题的解决方案记录在这里,包括这个小gem:
1 W1 F" K2 L! b2 P* Q& I% |CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))& c' w/ a+ w+ {2 O& \
RETURNS table
7 ?- n2 Z5 r" u' S* @+ r* w3 zAS9 a1 ?; d& B# [
RETURN (( R5 q& K3 v$ E o/ Z6 g
WITH Pieces(pn, start, stop) AS (& W- g: x8 x V, ~& j5 w8 k
SELECT 1, 1, CHARINDEX(@sep, @s)
( P8 r, C2 C3 ]) _, z& ?1 f UNION ALL" m6 ?- W2 C4 C8 ?* W0 Q
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
9 A5 _2 L" p0 H1 E9 V0 N( B! p9 M9 U FROM Pieces
9 |4 |' h; S8 i; T WHERE stop > 01 {0 B. W/ v( j' l9 I/ u: L1 `
)
. [, J- H8 }( a/ t+ J1 j8 I; s SELECT pn,
7 j6 ?- ~" t7 w/ c# I: \ SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
) b( P( [. B3 h+ G" B FROM Pieces; }. Q% \5 _4 } C* l' J
) |
|