SQL点滴3—一个简单的字符串分割函数

简介: 偶然在电脑里看到以前保存的这个函数,是将一个单独字符串切分成一组字符串,这里分隔符是英文逗号“,”  遇到其他情况只要稍加修改就好了 CREATE FUNCTION dbo.f_splitstr(     @str varchar(8000))RETURNS @r TABLE(id int ID...

偶然在电脑里看到以前保存的这个函数,是将一个单独字符串切分成一组字符串,这里分隔符是英文逗号“,”  遇到其他情况只要稍加修改就好了

CREATE FUNCTION dbo.f_splitstr(

    @str varchar(8000)
)RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))
AS
BEGIN
 /* Function body */
    DECLARE @pos int
    SET @pos = CHARINDEX(',', @str)
    WHILE @pos > 0
    BEGIN
        INSERT @r(value) VALUES(LEFT(@str, @pos - 1))
        SELECT
            @str = STUFF(@str, 1, @pos, ''),
            @pos = CHARINDEX(',', @str)
    END
    IF @str > ''
        INSERT @r(value) VALUES(@str)
    RETURN

END

 截图如下

 

2011-11-15 10:15:28

今天在园子里看到另外一个实现方法,不妨借鉴一下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*by kudychen 2011-9-28 */
CREATE function [dbo].[SplitString]
(
@Input nvarchar(max), --input string to be separated
@Separator nvarchar(max)=',', --a string that delimit the substrings in the input string
@RemoveEmptyEntries bit=1 --the return value does not include array elements that contain an empty string
)
returns @TABLE table
(
[Id] int identity(1,1),
[Value] nvarchar(max))
as
begin
declare @Index int, @Entry nvarchar(max)
set @Index = charindex(@Separator,@Input)

while (@Index>0)
begin
set @Entry=ltrim(rtrim(substring(@Input, 1, @Index-1)))

if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>'')
begin
insert into @TABLE([Value]) Values(@Entry)
end

set @Input = substring(@Input, @Index+datalength(@Separator)/2, len(@Input))
set @Index = charindex(@Separator, @Input)
end

set @Entry=ltrim(rtrim(@Input))
if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>'')
begin
insert into @TABLE([Value]) Values(@Entry)
end
return

end

使用方法

declare @str1 varchar(max), @str2 varchar(max), @str3 varchar(max)

set @str1 = '1,2,3'
set @str2 = '1###2###3'
set @str3 = '1###2###3###'

select [Value] from [dbo].[SplitString](@str1, ',', 1)
select [Value] from [dbo].[SplitString](@str2, '###', 1)
select [Value] from [dbo].[SplitString](@str3, '###', 0)

里面还有个自增的[Id]字段哦,在某些情况下有可能会用上的,例如根据Id来保存排序等等。

 

例如根据某表的ID保存排序:

update a set a.[Order]=t.[Id]       
from [dbo].[表] as a join [dbo].SplitString('1,2,3', ',', 1) as t on a.[Id]=t.[Value]

具体的应用请根据自己的情况来吧



作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com  联系我,非常感谢。

目录
相关文章
|
14天前
|
SQL 索引
在 SQL Server 中使用 STRING_AGG 函数
【8月更文挑战第5天】
165 2
在 SQL Server 中使用 STRING_AGG 函数
|
12天前
|
SQL 数据库
|
14天前
|
SQL XML JSON
在 SQL Server 中使用字符串转义
【8月更文挑战第5天】
38 7
在 SQL Server 中使用字符串转义
|
14天前
|
SQL 缓存 BI
在 SQL Server 中使用 SPACE 函数
【8月更文挑战第5天】
40 6
在 SQL Server 中使用 SPACE 函数
|
11天前
|
SQL 数据采集 数据处理
如何在 SQL Server 中使用 LEN 函数
【8月更文挑战第9天】
33 1
如何在 SQL Server 中使用 LEN 函数
|
14天前
|
SQL 数据格式
在 SQL Server 中使用 STR 函数
【8月更文挑战第5天】
63 3
在 SQL Server 中使用 STR 函数
|
12天前
|
SQL 监控 索引
如何在 SQL Server 中使用 `PATINDEX` 函数
【8月更文挑战第8天】
87 9
|
12天前
|
SQL 关系型数据库 MySQL
如何在 SQL Server 中使用 `REPLACE` 函数
【8月更文挑战第8天】
108 9
|
13天前
|
SQL 存储 关系型数据库
SQL字符串查询有哪些坑?
本文通过创建一个包含不同格式姓名数据的表格,探讨了MySQL中字符排序规则(Collation)的影响。通过使用不区分大小写和空格的查询条件,文章演示了如何获取所有插入的记录,并解释了排序规则中&quot;_ci&quot;、&quot;_cs&quot;及&quot;_bin&quot;的区别。此外,还强调了在数据处理过程中,应考虑大小写敏感性和字符串前后空格的问题,以防导致统计或比较上的错误。最后,提供了Go语言中处理这类问题的方法,如使用`strings.EqualFold()`进行不区分大小写的字符串比较,以及使用`strings.TrimSpace()`去除字符串两端的空白字符。
|
26天前
|
JSON 数据格式 SQL
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决