经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是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,如需转载请自行联系原作者

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

  1. 【Kotlin】字符串操作 ① ( 截取字符串函数 substring | 拆分字符串函数 split | 解构语法特性 )

    文章目录 一.截取字符串函数 substring 二.拆分字符串函数 split 一.截取字符串函数 substring Kotlin 中提供了 截取字符串函数 substring , 可接收 Int ...

  2. java split函数的用法,java拆分字符串_java中split拆分字符串函数用法

    摘要 腾兴网为您分享:java中split拆分字符串函数用法,中信期货,掌上电力,星球联盟,淘集集等软件知识,以及韩剧精灵,每日英语听力vip,龙卷风收音机,优衣库,中国平煤神马集团协同办公系统,光晕 ...

  3. 数据库拆分字符串函数_PHP | 不使用库函数将逗号分隔的字符串拆分为数组

    数据库拆分字符串函数 Given a string with comma delimited, we have to split it into an array. 给定一个以逗号分隔的字符串,我们必 ...

  4. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  5. mysql怎么拆字符串_MySQL截取和拆分字符串函数用法示例

    本文实例讲述了MySQL截取和拆分字符串函数用法.分享给大家供大家参考,具体如下: 首先说截取字符串函数: SUBSTRING(commentid,9) 这个很简单,从第9个字符开始截取到最后.SUB ...

  6. mysql截取字符串一部分_MySQL截取和拆分字符串函数用法示例

    本文实例讲述了MySQL截取和拆分字符串函数用法.分享给大家供大家参考,具体如下: 首先说截取字符串函数: SUBSTRING(commentid,9) 这个很简单,从第9个字符开始截取到最后.SUB ...

  7. 向sqlserver数据库中传递类似数组的参数解决办法

    向sqlserver数据库中传递类似数组的参数解决办法 关于sqlserver数据库存储过程传递varchar类型参数(后端给出参数格式 '1,2,3').但是查询始终没有结果,但是直接写在语句中确实 ...

  8. [转-记] 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11

    原文链接:批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor - 桦仔 - 博客园 ------------------------------------- ...

  9. sqlserver根据字段查表_查找sqlserver数据库中,查询某值所表名和字段名

    有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将这个存储过程放在所查询的数据库. CR ...

最新文章

  1. 简洁版本 STP/RSTP/MSTP的区别以及各自的特点
  2. 苏黎世联邦理工学院SML课题组招收统计机器学习全奖博士生
  3. 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
  4. 透视映射和射影映射的关系 Perspective and Projectivity
  5. impala元数据放到mysql_impala系列: 同步Hive元数据和收集统计信息
  6. 社交网络登录失败 当尝试用您的社交网络账号进行第三方登录时,发生了一个错误。
  7. 怎么将SVG转成PNG(.NET工具包编写)
  8. log4j2 logger_简单一致的Log4j2 Logger命名
  9. 这个算是编码的坏习惯吧?
  10. mysql管理索引_Mysql管理表和索引
  11. 《信号与系统》(吴京)部分课后习题答案与解析——第四章(PART5)(系统分析、传输与滤波)
  12. IP地址的定义与分类
  13. 利用云片网提供的API发送短信
  14. MFC PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口问题
  15. 计算机体系结构复习笔记
  16. ORA-01507错误
  17. 智慧校园解决方案:一站式解决校园数字化转型难题
  18. java 锁旗标_Java基础知识点整理(一)
  19. java preferences设置_Java利用Preferences设置个人偏好
  20. Excel 恢复默认行高、列宽

热门文章

  1. Nginx虚拟机主机根据不同的域名使用不同的root路径
  2. Solr添加SolrDocument报错
  3. Drupal中的分类(Taxonomy)用法 (转)
  4. 几种Linux包管理系统的命令对照
  5. 从QQ聊天看51CTO版主专业精神和工作态度!
  6. 第1章 游戏之乐——构造数独
  7. 【Android】附加Android源代码Androidandroid_gingerbread_javasrc
  8. 15 个 JavaScript Web UI 库 (转)
  9. 在Centos中安装aria2c
  10. ReactiveCocoa