zoukankan      html  css  js  c++  java
  • 自己动手写SQL字符串分解函数Split up

      前段时间,在做一个可以批量审核或删除数据的功能时,遇到这么个问题:

      因为审核或删除操作是在存储过程进行的,所以,就打算将选中的数据的主键拼成字符串,传到存储过程进行分离,再继续处理。

      C#中和JavaScript中都有相应的分离字符串的Split函数,就想当然的以为SQL中也会有类似的函数,结果查了半天的MSSQL帮助文档,也没找到。

      没办法,只好自己写了,在网上搜了下相关的,看了一两篇关于SQL分离字符串的自定义函数的文章,结果,有点失望,可能是自己水平差,或者是因为人家的代码没写注释吧,总之就是看着挺吃力的,还没看完就决定自己写了。。。

      思路很简单:在需要分解的字符串中,如果存在指定的分隔符,则将第一个分隔符前面的字符串取出,存入表内,然后在需要分解的字符串中将已取出的字符串及第一个分隔符删除,然后继续下一次分解(如果还存在指定的分隔符,就分解)

      以下是SQL:

     1 -- =============================================
    2 -- Author: Henson
    3 -- Create date: 2011-04-20
    4 -- Description: 字符串分离函数
    5 -- =============================================
    6 ALTERFUNCTION[dbo].[Split]
    7 (
    8 @strTextvarchar(3000),--待分离的原字符串
    9 @strSplitvarchar(100)--分隔符
    10 )
    11 RETURNS@tempTable
    12 (
    13 ID intIDENTITYPRIMARYKEY,
    14 SingleVal varchar(1000)
    15 )
    16 AS
    17 BEGIN
    18 Declare@intLenint--用来存储待分离原字符串长度
    19 Declare@intSplitLenint--分隔符长度
    20 Declare@intIndexint--用来存储分离字符串在原字符串的位置
    21 Declare@strValvarchar(1000)--用来存储分离出来后的字符串
    22 --获取原字符串的长度
    23 Set@intLen=LEN(RTRIM(LTRIM(@strText)))
    24 Set@intSplitLen=LEN(RTRIM(LTRIM(@strSplit)))
    25 --原字符串不为空,才继续分离
    26 If(@intLen>0)
    27 Begin
    28 --循环原字符串,直至原字符串被分离完毕
    29 WhileCHARINDEX(@strSplit,@strText)>0
    30 Begin
    31 --获取分离字符串在原字符串的位置
    32 Set@intIndex=CHARINDEX(@strSplit,@strText)
    33 --获取分离出的字符串,并插入表中
    34 Set@strVal=RTRIM(LTRIM(LEFT(@strText,@intIndex-1)))
    35 if(LEN(@strVal)>0)
    36 Begin
    37 InsertInto@temp (SingleVal) values(@strVal)
    38 End
    39 --分离后,将分离出的字符串(包括分隔符)从原字符串中删除
    40 Set@strText=Substring(@strText,@intIndex+@intSplitLen,@intLen-@intIndex)
    41 --重新设置原字符串的长度
    42 Set@intLen=LEN(@strText)
    43 End
    44 --如果分离后的原字符串依然不为空,则也应该插入表中
    45 if(LEN(RTRIM(LTRIM(@strText)))>0)
    46 Begin
    47 InsertInto@temp (SingleVal) values(@strText)
    48 End
    49 End
    50 return
    51 END

      (分隔符允许是多位的)

      按一般的习惯来说,在组织多个字符串时,一般都是这种写法:strKeys += strSingleKey + ",";

      所以可能最终该字符串可能会以逗号结尾,如果组织完成后,将结尾的逗号去掉了,那就不会以逗号结尾,所以,在循环分解完成后,如果剩下的原字符串中(去除左右空格后),如果还有内容 ,则也应该存入表中。  

      可能我这种写法不是最好的,也可能会有问题,如确实有需要改进的,还请指出,不胜感激!!!

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/uphenson/p/2109452.html
Copyright © 2011-2022 走看看