SQL Server自定义字符串分割函数——Split
时间:2021-07-01 10:21:17
帮助过:10人阅读
USE [Test]
2 GO
3 /****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2017/4/14 23:04:08 ******/
4 SET ANSI_NULLS
ON
5 GO
6 SET QUOTED_IDENTIFIER
ON
7 GO
8 CREATE FUNCTION [dbo].
[Split](
@separator VARCHAR(
64)
=‘,‘,
@string NVARCHAR(
max))
9 RETURNS @ResultTab TABLE (
10 Id
INT ,
11 Res
NVARCHAR(
500)
12 )
13 AS
14 BEGIN
15 DECLARE @Num INT
16
17 IF(
@string IS NOT NULL AND @string <> ‘‘ AND LEN(
@string)
>0)
18 BEGIN
19 IF(
CHARINDEX(
@separator,
@string)
>0)
--判断要截取的字符是否存在
20 BEGIN
21 SET @Num=0
22 WHILE (
CHARINDEX(
@separator,
@string)
>0)
--如果要截取的字符存在,就继续循环
23 BEGIN
24 SET @Num=@Num+1
25
26 INSERT INTO @ResultTab(Id,Res)
--截取字符串,插入表变量
27 SELECT @Num,
LEFT(
@string,
CHARINDEX(
@separator,
@string)
-1)
28
29 --把已经截取并插入的字符串删除
30 SET @string=STUFF(
@string,
1,
CHARINDEX(
@separator,
@string)
-1+LEN(
@separator),
‘‘)
31 END
32
33 --如果最后一个截取的字符串为空,那就不插入了
34 --例如:‘123,456,789,‘ 这样的字符串最后剩下的就是空字符串了
35 IF(
@string IS NOT NULL AND @string <> ‘‘)
36 BEGIN
37 INSERT INTO @ResultTab(Id,Res)
38 SELECT @Num+1,
@string
39 END
40 END
41 ELSE
42 BEGIN
43 DELETE FROM @ResultTab
44 END
45 END
46 ELSE
47 BEGIN
48 DELETE FROM @ResultTab
49 END
50 RETURN
51 END
下面来调用一下试试效果:
1 --因为这个函数创建的时候默认为以 逗号 分割,所以只需要使用 default 关键字就可以了
2 select * from Split(default,‘123,456,789‘)
3
4 select * from Split(default,‘123,456,789,‘)
5
6 --下面试试其它字符分割
7 select * from Split(‘abc‘,‘11111abc22222abc33333‘)
8
9 select * from Split(‘abc‘,‘11111abc22222abc33333abc‘)
不足的地方就是不能直接作用于表,和不能同时支持多字符分割。
当然,如果多定义几个参数,也是勉强可以的,不过我想的是能够和 C# 那种可以传入一个分割字符的数组,不过貌似 sql 自定义函数的参数不支持 table 类型。
另外,如果有什么好的想法,可以探讨一下。多谢~
SQL Server自定义字符串分割函数——Split
标签:ring let 自己 split arc 代码 create _id creat