【叶子函数分享三十六】SQL2000/2005字符串拆分为列表通用函数

本文介绍了一种在SQL Server 2000/2005中将字符串拆分为列表的通用函数。该函数能够根据指定的分隔符或者逐字符地拆分字符串,并返回一个表格形式的结果集。此外,还展示了如何结合SQL Server 2005的APPLY操作符使用此函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 原帖地址:http://blog.youkuaiyun.com/htl258/archive/2010/04/28/5537235.aspx

------------------------------------------------------------------

-- Author : htl258(Tony)

-- Date : 2010-04-28 02:00:28

-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

-- Jul 9 2008 14:43:38

-- Copyright (c) 1988-2008 Microsoft Corporation

-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

-- Blog : http://blog.youkuaiyun.com/htl258

-- Subject: SQL2000/2005字符串拆分为列表通用函数

-------------------------------------------------------------------

--SQL2000/2005字符串拆分为列表通用函数

IF OBJECT_ID('f_getstr') IS NOT NULL

DROP FUNCTION f_getstr

GO

CREATE FUNCTION f_getstr(

@s NVARCHAR(4000), --待分拆的字符串

@flag NVARCHAR(10)='' --数据分隔符

)RETURNS @r TABLE(col NVARCHAR(1000))

AS

BEGIN

IF ISNULL(@flag,'')='' AND LEN(ISNULL(@flag,'')+'a')=1

INSERT @r

SELECT SUBSTRING(@s,number+1,1)

FROM master..spt_values

WHERE TYPE='p' and number<LEN(@s+'a')-1

ELSE

INSERT @r

SELECT SUBSTRING(@s,number,CHARINDEX(@flag,@s+@flag,number)-number)

FROM master..spt_values

WHERE TYPE='p' and number<=len(@s+'a')

--AND SUBSTRING(@flag+@s,number,1)=@flag --用此条件或下面的条件均可

AND CHARINDEX(@flag,@flag+@s,number)=number

RETURN

END

GO

--本实例技巧,利用master库自带的spt_values表,取number字段作为连续的序号,

--省去创建序号表,尽量做到通用,再加上字符串处理函数取得最终结果。

--1.每个字符拆分取出

SELECT * FROM dbo.f_getstr(N'一个世界一个家',NULL)

SELECT * FROM dbo.f_getstr(N'一个世界一个家','')

SELECT * FROM dbo.f_getstr(N'一个世界一个家',default)

/*

col

-------

(7 行受影响)

*/

--2.指定分隔符拆分取出

SELECT * FROM dbo.f_getstr(N'一个世界一个家',N' ')

SELECT * FROM dbo.f_getstr(N'一个,世界,一个,',N',')

SELECT * FROM dbo.f_getstr(N'一个%世界%一个%',N'%')

SELECT * FROM dbo.f_getstr(N'一个中国世界中国一个中国家',N'中国')

/*

col

---------

一个

世界

一个

(4 行受影响)

*/

--3.SQL2005以上版本可以结合apply进行拆分列值

IF OBJECT_ID('tb') IS NOT NULL

DROP TABLE tb

GO

CREATE TABLE tb (id INT,col VARCHAR(30))

INSERT INTO tb VALUES(1,'aa,bb')

INSERT INTO tb VALUES(2,'aaa,bbb,ccc')

GO

SELECT id,b.col FROM tb CROSS APPLY f_getstr(col,',') b

SELECT id,b.col FROM tb OUTER APPLY f_getstr(col,',') b

/*

id col

----------- -----------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

(5 行受影响)

*/

--本文来自优快云博客

--转载请标明出处:

--http://blog.youkuaiyun.com/htl258/archive/2010/04/28/5537235.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值