邙山之巅 承接网站建设 + 网站推广 + 网站优化 + IDC + 网络广告等业务。

本博客网页模板,经过SEO优化和测试, 保证其 完整性 + 无错性 + 美观性 + 最简性 !
完整性 -头部尾部完整,首页,列表,内容完整.无错性 -整站模板安装即可使用,Js无错误,兼容IE6,IE7,ie8,FF
美观性 -整体协调,美观大方,配色合理.最简性 -采取DIV+CSS布局,整站无垃圾代码,架构合理,减少下载时间,节省带宽

打造自己的Sql Spilt()函数

时间:2012-05-21 18:38来源:未知 作者:admin 点击:

在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是Sql中没有实现字符串分组的Split方 法。因此就需要编写一个自定义的Split函数。我首先是使用表值函数的方法实现的字符串分组,但是在使用中感觉不是很方便。后来又在网上找到了一种使用 两个标量函数,其中一个函数首先返回分割后字符数组的长度,另一个函数依次返回每个分割出的字符串。然后使用循环依次获取分割的字符。

表值函数实现Split方法

  Create FUNCTION [dbo].[SplitToTable]
  (
 
     @SplitString nvarchar(max),
 
     @Separator nvarchar(10)=' '
  )
 
 RETURNS @SplitStringsTable TABLE
  (
 
 [id] int identity(1,1),
 
 [value] nvarchar(max)
 )
 AS
 BEGIN
     DECLARE @CurrentIndex int;
     DECLARE @NextIndex int;
     DECLARE @ReturnText nvarchar(max);
     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

select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')

结果为

id          value
----------- ---------------------------------------
1           111
2           b2222
3           323232
4           32d
5           e
6           323232f
7           g3222

(7 行受影响)

使用循环的方法

首先GetSplitLength函数返回分割后的字符数组的长度。

  Create function [dbo].[GetSplitLength]
  (
 
  @String nvarchar(max),  --要分割的字符串
   @Split nvarchar(10)  --分隔符号
  )
 
 returns int
  as
  begin
   declare @location int
  declare @start int
  declare @length int
 
  set @String=ltrim(rtrim(@String))
  set @location=charindex(@split,@String)
  set @length=1
  while @location<>0
  begin
    set @start=@location+1
    set @location=charindex(@split,@String,@start)
    set @length=@length+1
  end
  return @length
 end

select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')

结果为7。

GetSplitOfIndex函数是按顺序分别获取分割后的字符串。

  Create function [dbo].[GetSplitOfIndex]
  (
 
  @String nvarchar(max),  --要分割的字符串
   @split nvarchar(10),  --分隔符号
   @index int --取第几个元素
  )
 
 returns nvarchar(1024)
 
 as
  begin
  declare @location int
  declare @start int
  declare @next int
  declare @seed int
 
  set @String=ltrim(rtrim(@String))
  set @start=1
  set @next=1
  set @seed=len(@split)
  
  set @location=charindex(@split,@String)
  while @location<>0 and @index>@next
  begin
    set @start=@location+@seed
    set @location=charindex(@split,@String,@start)
    set @next=@next+1
 end
  if @location =0 select @location =len(@String)+1 
  
  return substring(@String,@start,@location-@start)
 end

 select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)

结果323232。

  DECLARE @Tags nvarchar(max);
 
 SELECT @Tags='111,b2222,323232,32d,e,323232f,g3222';
 
 DECLARE @Tag nvarchar(1000)
 
 DECLARE @next int;
 
 set @next=1
  
  DECLARE @Length int;
 
 SELECT @Length=dbo.GetSplitLength(@Tags,',')
 
 
 while @next<=@Length
 begin
     SET @Tag = left(dbo.GetSplitOfIndex(@Tags,',',@next), 16);
     print @Tag
     SET @Next=@Next+1;
 END

结果为:

111
b2222
323232
32d
e
323232f
g3222

 

(责任编辑:admin)
首页 - 技术交流 - 生活感悟 - 影视音乐 - 网址导航 - 图片收藏 - 实用工具 - 网站地图 - 百度地图 - RSS地图
邙山之巅:软件攻城师,互联网砖家,山水田园诗人,著名的思想家,政治家,文学家。
是中华人民共和国合法公民,在计算机软件方面有较高造诣。著有《放羊的那些事》一书,书中描绘了自己童年时代放羊的美好时光,
告诫人们要保护环境,否则以后只能在上海的南京路上放羊了。同时脑细胞异常活跃,经常胡思乱想,目前正在思考如何解决“欧债危机”和“美债危机”这两个世界级难题。
邙山之巅:从小就饱读诗书,学前班连上五年,破世界吉尼斯纪录,因此基础知识功底非常深厚。7岁能够看懂A片,8岁可以腾云吐雾,9岁号称千杯不倒,10岁已然有了一次轰轰烈烈的恋爱。此时此刻,很多东西对他来说早已是风轻云淡。后来考取了美国法克由大学的全能博士学位,成为华人中获得此高等学位的第一人。
在计算机方面的成就:精通C,C++,C#,JAVA,PHP,ASP,VB,DELPHI,ORACLE,MYSQL等。尤其精通网页前后台,设计,DIV+CSS,PHP+MYSQL,js,以及各种流行CMS。
新公司堆积3个月的活,被其一周干完。曾因技术过强,工作效率过高,而遭人嫉妒。 政治学方面成就:成功收复台湾,维护了台海稳定。
经济学方面的成就:帮助世界各国成功度过经济危机,并且成功预测了后经济危机时代的到来。 文学方面的成就:著《放羊的那些事》,以及10篇评论性文章,均未发表或出版。
Copyright ◎ 2012-2022 lixinwei.cn 邙山之巅 版权所有
豫ICP备17045676号-1 给我写信