回答

收藏

T-SQL将字符串拆分为多对一关系吗?

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

我有以下SQL脚本:, r# F5 c. I8 O$ o; V1 |
DECLARE @temp table ($ }$ e- H+ U" t- V
    ID int IDENTITY(1, 1),
( u( C% M! M, k3 {6 Q    data nvarchar(100)( w+ f" |0 r# B( @: @
)  K) ]* ?) i, L; a3 T8 U
INSERT INTO @temp (data) VALUES ('a,b,c')
3 i) F5 u' n4 E' N: H% m2 V: PINSERT INTO @temp (data) VALUES ('d,e,f')
, w, G: o+ I+ q7 f+ S3 P1 q1 c/ QSELECT *
6 S: G' R) c( PFROM @temp AS T
/ h. K: F, F4 e0 |; ]    INNER JOIN8 T2 l- a# r* i# T6 U5 Q
        (SELECT *9 Y2 P2 ]/ I" l' Z8 U& o
        FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S  T3 l, A4 x2 \+ I* H
    ON T.ID = S.RefID  i4 \4 k2 R* P
然后单击!Execute之后,我得到了这些:! p- Z1 |, d5 ^3 V/ q# E' m' _! |
Line 17 The multi-part identifier "T.data" could not be bound.- c0 ~. v' G9 t
我也尝试了非联合版本,并得到了相同的错误:
( u! @" }* @, s9 Q+ a3 a% C" i' l# aSELECT T.ID, S.Item AS dataItem8 L! I+ i6 s( l) S! W# [0 }! d, A
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
7 o: m8 U- {+ i- j8 q% _+ YWHERE T.ID = S.RefID
* s# q! [  P* n% m8 y
+ `( ?. x8 @1 H0 O我所期望的是,我应该获得一个ID,其ID来自@ test.ID的表,并且@5 C1 H2 }3 i: l$ K4 m7 B* F* G
test.data中每个逗号分隔的值都拆分成自己的记录,并将其值放入dataItem字段中。
$ s5 f  {# r" V
我该怎么做?
3 R7 M; }8 v$ [* g我需要使用游标吗?% L( ~& m  _& G" w, Q
我在http://pastebin.com/f7dd6350f粘贴了dbo .__4 y6 y1 [; g. ?" y7 S
StringSplit表值函数实现
4 U8 L" V* q9 o* ^$ {4 k* `' i谢谢!
0 T; _8 i5 m$ t# h0 I" ?+ ]9 H               
7 p) {6 x7 \0 l( }) b: n解决方案:
: \0 b0 B5 ~9 c/ p1 ], v$ c+ k                ) w1 {* G  T0 e" @+ H& d: m: W

0 p: H/ ^+ D: Y, s4 I
0 V! w( a& ~/ ?5 J1 a                在SQL2000中,您需要游标。在SQL2005 / 2008中,可以使用CROSS APPLY填充;可能像下一个(目前无法测试):
' ]3 C+ b4 C1 o& c  Z' kSELECT T.ID, S.Item AS dataItem5 C7 R8 h& N. P9 B) u9 s
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S0 }, [9 J# d" i* {1 @* j" ]. e
" l' D0 U$ f3 R: N8 n" [/ |
编辑 -我在CROSS APPLY上找到了此页面,然后想到了:2 {" K; s  d* x7 L9 T- w
SELECT T.ID, S.Item AS dataItem0 F. Q! `1 \6 ~/ @! R" l+ G8 w: P
FROM @temp AS T
+ k6 e" G% c/ R$ {. q  C/ V. t8 Q# i    CROSS APPLY
. }2 p  O8 H( ?# s    dbo.__StringSplit(T.data, ',', T.ID) AS S
: |; l- T8 Z# q5 m4 N, \. ?WHERE T.ID = S.RefID
# t4 P" s1 k& T, x! c解决了我的问题:-)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则