注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

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

2011-12-29 17:29:21|  分类: MS SQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是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有了这些函数我们就可以很好的利用他们来为我们的更有效的批量操作。当然由于变量都是考虑到溢出而设置的,肯能这样会给性能上带来一定的影响,但是编译后可能也可以给我们带来不少的效果,请大家慎用之。

==================================================
本文可以随意转载,摘抄等非商业用途;
为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处;
关于作者:网魂小兵
熟悉程序:ASP.NET(C#), C/C++,JAVASCRIPT,SQLSERVER,MYSQL...
熟悉项目:CommunityServer,JQuery,Mangos
研发项目:秘密
  评论这张
 
阅读(514)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017