[SqlServer]数据库中自定义拆分字符串函数Split()

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
  经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是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,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2天前
|
Cloud Native 关系型数据库 分布式数据库
云原生数据库PolarDB自定义权限策略参考
本文介绍了自定义权限策略,它是RAM访问控制体系中除系统策略外,用户可创建、更新和删除的权限策略。用户需维护策略版本更新,并将策略绑定到RAM身份以授予权限。策略支持版本控制和删除,但删除前需确保无引用。文章提供了相关操作文档链接,包括创建、修改、删除策略及管理引用记录和版本。此外,列举了PolarDB在MySQL、PostgreSQL和XScale版的自定义权限策略场景和示例,并提示用户在使用时需了解授权信息。
15 0
|
5天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之当 SQL Server 源数据库中的数据更新后,CDC 吐出的操作(op)是怎样的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
15 0
|
6天前
|
存储 数据库
sqlserver------数据库的存储过程(练习)
sqlserver------数据库的存储过程(练习)
8 1
|
6天前
|
数据库
sqlserver数据库学习感悟(1)----关于group by
sqlserver数据库学习感悟(1)----关于group by
9 0
|
6天前
|
SQL Oracle 关系型数据库
数据库sqlserver-----触发器的插入,更新和删除
数据库sqlserver-----触发器的插入,更新和删除
14 3
|
6天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
16 2
|
4天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
79 0
|
6天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
60 0
|
6天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
44 0
|
6天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
47 0