22,209
社区成员
发帖
与我相关
我的任务
分享
WITH cte1 AS(SELECT case when left(@Expression,len(@Delimiter))=@Delimiter then '' else @Delimiter end +@Expression+
case when right(@Expression ,len(@Delimiter))=@Delimiter then '' else @Delimiter end AS Expression),
--构建自然数表
L0 AS(SELECT 1 AS n UNION ALL SELECT 1),
L1 AS(SELECT 1 AS n FROM L0 a,L0 b),
L2 AS(SELECT 1 AS n FROM L1 a,L1 b),
L3 AS(SELECT 1 AS n FROM L2 a,L2 b),
L4 AS(SELECT 1 AS n FROM L3 a,L3 b),
L5 AS(SELECT 1 AS n FROM L4 a,L4 b),
cte2 AS(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS n FROM L5)
/*SELECT SUBSTRING(@Delimiter+@Expression+@Delimiter,n+1,
CHARINDEX(@Delimiter,@Delimiter+@Expression+@Delimiter,n+1) -n-1 ) AS list
FROM cte2 n
WHERE SUBSTRING(@Delimiter+@Expression+@Delimiter,n,1)=@Delimiter
AND n.n<LEN(@Delimiter+@Expression+@Delimiter)
AND isnull(@Expression,'')<>''
AND ISNULL(@Delimiter,'')<>''*/
--分隔字符串
SELECT SUBSTRING(b.Expression,n+1,CHARINDEX(@Delimiter,b.Expression,n+1) -n-1 ) AS list
FROM cte2 n,cte1 b
WHERE SUBSTRING(b.Expression,n,1)=@Delimiter
AND n.n<LEN(b.Expression)
AND isnull(@Expression,'')<>''
AND ISNULL(@Delimiter,'')<>''
AND SUBSTRING(b.Expression,n+1,CHARINDEX(@Delimiter,b.Expression,n+1) -n-1 )<>''
)
SELECT * from dbo.[Split]('/1/2/3/4/6/3/3/2/6/23/42/23/23/','/')
SELECT * from dbo.[Split]('/1/2/3/4/6/3/3/2/6/23/42/23/23/','/') WHERE list='1'
消息 536,级别 16,状态 5,第 1 行
传递到 SUBSTRING 函数的长度参数无效。
CREATE TABLE testTable (DATA VARCHAR(200))
INSERT INTO testTable
SELECT '1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457,'
UNION ALL
SELECT 'sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2,'
UNION ALL
SELECT 'ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa,'
SELECT * FROM testTable a CROSS APPLY SPLIT(a.data,',')
DROP TABLE testtable
SELECT * FROM @A A OUTER APPLY
(SELECT * FROM @B
WHERE ID=A.ID)B
--等价于
SELECT * FROM @A A LEFT JOIN @B B
ON A.ID=B.ID
[Quote=引用 5 楼 xxyj6450 的回复:]
SELECT * FROM testTable a CROSS APPLY newSplit(a.data,',')
/*
DATA list
------------------------------------------------------------ ---------
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 1
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 23
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 43
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 4
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 2
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 42
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 23
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 4
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 5
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 3
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 4
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 2
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 2
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 25
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 7
1,23,43,4,2,,42,,23,4,5,3,4,2,2,25,7,457, 457
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, sd
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, sgas
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, g
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, fdg
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, f
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, as
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, 2
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, e
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, 23
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, er
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, gf
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, d
sd,sgas,g,fdg,,f,as,,2,e,23,er,gf,d,sdf2, sdf2
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, ad
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, ads
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, s
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, g
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, fg
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, we
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, wer
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, g
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, fg
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, a
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, d
ad,ads,,s,g,fg,,,we,wer,,g,fg,a,d,,aa, aa
(41 row(s) affected)
*/
apply 操作符应该是2005新增的DML增强功能,与JOIN有相似的功能,apply操作符对于查询操作的外部表
(左输入)返回的每个行都会对右输入进行运算,这个右输入一般是表值函数,并且函数会取左边输入的
列值作为函数的参数;
APPLY有两种形式:cross apply 以及outer apply 两者的区别在于后者返回是否返回空结果集行,
outer apply都返回。
这个只是在学习的时候用到过,在性能调优问题上基本没测试过..就不懂了。只是了解了基本的使用
方法.