澳门金沙vipSQL Server实现Split函数将字符串分隔转换成数据表

复制代码
代码如下:–创建一个函数,函数中有两个参数 Create FUNCTION
[dbo].[SplitToTable](@SplitString
nvarchar(max),–输入的字符串@Separator nvarchar(10)=’
‘–分割条件)–返回的数据为一个表RETURNS @SplitStringsTable TABLE([id]
int identity(1,1),[value] nvarchar(max))ASBEGINDECLARE @CurrentIndex
int;–当前索引DECLARE @NextIndex int;–下一个索引DECLARE @ReturnText
nvarchar(max);–返回内容SELECT
@CurrentIndex=1;–设置当前索引初始值为1–当当前索引小于字符串长度时,执行循环体WHILE(@CurrentIndex=len(@SplitString))BEGIN–CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下:–CHARINDEX
( expression1 , expression2 [ , start_location ] )–
Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。SELECT
@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);IF(@NextIndex=0
OR @NextIndex IS NULL)SELECT
@NextIndex=len(@SplitString)+1;–函数用法:SUBSTRING ( expression,
start, length )SELECT
@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);INSERT
INTO @SplitStringsTable([value]) VALUES(@ReturnText);SELECT
@CurrentIndex=@NextIndex+1;ENDRETURN;ENDgo–测试函数select * FROm
dbo.SplitToTable(‘a,b,c,d,e,f,g’, ‘,’)

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

需求

C#语言中有内置的字符串函数Split()可以轻松实现分隔将类似 1,2,3,4
的字符串变成数组,然后进行处理,但是SQL Server默认没有这种内置的支持。

表值函数实现Split方法

实现

需要通过自定义函数来实现,思路就是创建表值函数,返回一个分隔后的数据表,然后查询这个返回的表即可。

 1 Create FUNCTION [dbo].[SplitToTable]
 2 (
 3     @SplitString nvarchar(max),
 4     @Separator nvarchar(10)=’ ‘
 5 )
 6 RETURNS @SplitStringsTable TABLE
 7 (
 8 [id] int identity(1,1),
 9 [value] nvarchar(max)
10 )
11 AS
12 BEGIN
13     DECLARE @CurrentIndex int;
14     DECLARE @NextIndex int;
15     DECLARE @ReturnText nvarchar(max);
16     SELECT @CurrentIndex=1;
17     WHILE(@CurrentIndex<=len(@SplitString))
18         BEGIN
19             SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
20             IF(@NextIndex=0 OR @NextIndex IS NULL)
21                 SELECT @NextIndex=len(@SplitString)+1;
22                 SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
23                 INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
24                 SELECT @CurrentIndex=@NextIndex+1;
25             END
26     RETURN;
27 END

代码如下

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION [dbo].[SplitToTable_Func]

  (

      @SplitString varchar(max),

      @Separator nvarchar(10)=’ ‘

  )

 RETURNS @SplitStringsTable TABLE

 (

  [id] int identity(1,1),

  [value] varchar(max)

 )

 AS

 BEGIN

    IF @SplitString<>”

    BEGIN

     DECLARE @CurrentIndex int

     DECLARE @NextIndex int

     DECLARE @ReturnText varchar(max)

     SELECT @CurrentIndex=1

     WHILE(@CurrentIndex<=len(@SplitString)+1)

         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

    END

    RETURN

 END

 

调用方法

SELECT * FROM dbo.SplitToTable_Func(‘1,2,3,4′,’,’)

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

效果

澳门金沙vip 1

 

本文来自笔者博客,原文地址:SQL
Server实现Split函数将字符串分隔转换成数据表

结果为

id          value


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

(7 行受影响)