Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
SQL Server Oracle Access MySQL
当前位置: 主页 > 数据库 > SQL Server >

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

时间:2012-02-07 16:38来源:未知 作者:admin 点击:

经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下。为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作。当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了......

    1.当我们需要传入很长的字符串是我们可以借助NText和Text类型,他们的区别是一个是支持Unicode,一个是支持ANSI字符集的。需要注意的是当我们要计算字符串长度时我们需要用到DATALENGTH()而不是LEN(),在NText类型中一个字符占两个字节,所以在计算字符时别忘了除以2,下面我们先看下例子就能够说明一切了。

-- =======================
-- 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。下面我们来看一下代码,和上面的代码基本没什么差别。

-- ===========================

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


Tags:函数 字符串
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价