博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SqlServer]数据库中自定义拆分字符串函数Split()
阅读量:6868 次
发布时间:2019-06-26

本文共 3038 字,大约阅读时间需要 10 分钟。

 
经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下。为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作。当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了......
    1.当我们需要传入很长的字符串是我们可以借助NText和Text类型,他们的区别是一个是支持Unicode,一个是支持ANSI字符集的。需要注意的是当我们要计算字符串长度时我们需要用到DATALENGTH()而不是LEN(),在NText类型中一个字符占两个字节,所以在计算字符时别忘了除以2,下面我们先看下例子就能够说明一切了。
--
 =============================================
--
 Author:        <myxbing>
-
- Create date:   <2007/8/17>
--
 Description:   <拆分字符串函数>
--
 =============================================
CREATE
 
FUNCTION
 
[
dbo
]
.
[
Split
]
(
 
@SplitString
 
text
-- 如果要传入NText类型,下面需要相应的修改,注释行为NText下同
 
@Separator
 
varchar
(
2
=
 
'
,
'
-- NVarChar(2) = N','
)
RETURNS
 
@SplitStringsTable
 
TABLE
(
 
[
id
]
 
int
 
identity
(
1
,
1
),
 
[
value
]
 
varchar
(
8000
)
 -- NVarChar(4000)
)
AS
BEGIN
    
DECLARE
 
@CurrentIndex
 
int
;
    
DECLARE
 
@NextIndex
 
int
;
    
DECLARE
 
@ReturnText
 
varchar
(
8000
);
-- NVarChar(4000)
    
SELECT
 
@CurrentIndex
=
1
;
    
WHILE
(
@CurrentIndex
<=
datalength
(
@SplitString
)) 
-- DATALENGTH(@SplitString)/2
    
BEGIN
        
SELECT
 
@NextIndex
=
charindex
(
@Separator
,
@SplitString
,
@CurrentIndex
);
        
IF
(
@NextIndex
=
0
 
OR
 
@NextIndex
 
IS
 
NULL
)
            
SELECT
 
@NextIndex
=
datalength
(
@SplitString
)
+
1
;
--DATALENGTH(@SplitString)/2
        
        
SELECT
 
@ReturnText
=
substring
(
@SplitString
,
@CurrentIndex
,
@NextIndex
-
@CurrentIndex
);
        
INSERT
 
INTO
 
@SplitStringsTable
(
[
value
]
)
        
VALUES
(
@ReturnText
);
        
        
SELECT
 
@CurrentIndex
=
@NextIndex
+
1
;
    
END
    
RETURN
;
END
    有时我们拆分出来还是需要很长的字符串有可能超过(N)VarChar的长度,当然为了兼容SQL Server2000不能用max,所以我们拆出的字符串还是要用(N)Text来表示,
需要注意的是在局部变量中不能定义(N)Text的类型,不过我们可以把substring出来的字符串直接加入到表变量中,而不要付值后在Insert。
    2.当我们传入的(N)VarChar时,我们可以用LEN来计算长度,值得注意的是NVarChar的最大长度是4000,而VarChar的最大长度是8000。下面我们来看一下代码,和上面的代码基本没什么差别。
--
 =============================================
--
 Author:        <myxbing>
--
 Create date:   <2007/8/18>
--
 Description:   <拆分字符串函数>
--
 =============================================
CREATE
 
FUNCTION
 
[
dbo
]
.
[
Split
]
(
 
@SplitString
 
varchar
(
8000
),
-- nvarchar(4000)
 
@Separator
 
varchar
(
2
=
 
'
,
'
)
RETURNS
 
@SplitStringsTable
 
TABLE
(
 
[
id
]
 
int
 
identity
(
1
,
1
),
 
[
value
]
 
varchar
(
8000
)
-- nvarchar(4000)
)
AS
BEGIN
    
DECLARE
 
@CurrentIndex
 
int
;
    
DECLARE
 
@NextIndex
 
int
;
    
DECLARE
 
@ReturnText
 
varchar
(
8000
);
-- nvarchar(4000)
    
SELECT
 
@CurrentIndex
=
1
;
    
WHILE
(
@CurrentIndex
<=
len
(
@SplitString
)) 
    
BEGIN
        
SELECT
 
@NextIndex
=
charindex
(
@Separator
,
@SplitString
,
@CurrentIndex
);
        
IF
(
@NextIndex
=
0
 
OR
 
@NextIndex
 
IS
 
NULL
)
            
SELECT
 
@NextIndex
=
len
(
@SplitString
)
+
1
;
        
        
SELECT
 
@ReturnText
=
substring
(
@SplitString
,
@CurrentIndex
,
@NextIndex
-
@CurrentIndex
);
        
INSERT
 
INTO
 
@SplitStringsTable
(
[
value
]
)
        
VALUES
(
@ReturnText
);
        
        
SELECT
 
@CurrentIndex
=
@NextIndex
+
1
;
    
END
    
RETURN
;
END
    3.拆分字符串,得到int类型的数据,这个比较简单,代码和上面的差不多这里就不给出了,可以根据上面的代码自己改写。

    由于数据库中没有数组,所以只能用表变量返回,所以当你定义这些函数时要定义表值函数。OK有了这些函数我们就可以很好的利用他们来为我们的更有效的批量操作。当然由于变量都是考虑到溢出而设置的,肯能这样会给性能上带来一定的影响,但是编译后可能也可以给我们带来不少的效果,请大家慎用之。

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/08/18/sql_split_string.html,如需转载请自行联系原作者

你可能感兴趣的文章
接受键盘输入的Linux shell脚本
查看>>
使用VisualStudio2015开发QT项目
查看>>
C#取真实IP地址--多个代理背后的ip地址
查看>>
浅谈Dynamic 关键字系列之四:dynamic为什么比反射快
查看>>
Lambert(朗伯)光照模型 和Half Lambert的区别
查看>>
Microsoft dotnetConf 2015 一些整理
查看>>
python 图
查看>>
Unity应用架构设计(13)——日志组件的实施
查看>>
今天无意中发现的WWW.threadPriority
查看>>
js23---工厂模式1
查看>>
[转] Asp.Net 导出 Excel 数据的9种方案
查看>>
如何在Linux中用命令行工具管理KVM虚拟环境
查看>>
CSS 的优先级机制[总结]
查看>>
保证一个类仅有一个实例:单例模式
查看>>
JVM-ClassLoader装载class的流程
查看>>
redis实现分布式锁——核心 setx+pipe watch监控key变化-事务
查看>>
android 50 进程优先级
查看>>
软件设计之多边形区域内找点
查看>>
Medoo个人修改版
查看>>
Linux 上使用 Gmail SMTP 服务器发送邮件通知
查看>>