您的位置:首页 > 数据库

如何在T-sql 中实现数组的功能

2010-12-19 15:47 435 查看
T-SQL象数组一样处理字符串、分割字符串 在日常的编程过程中,数组是要经常使用到的。在利用SQL对数据库进行操作时,有时就想在SQL使用数组,比如将1,2,3,4,5拆分成数组。可惜的是在T-SQL中不支持数组。不过还是有变通的办法。我们可以自己编写两函数Get_StrArrayLength(取得字符串的长度-元素的个数)和Get_StrArrayStrOfIndex(按指定符号分割字符串,返回分割后指定索引的第几个元素)。有了这两个函数,我们就可以非常方便的在T-SQL中处理形如1,2,3,4,5这样的字符串了。

T-SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。

一、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。

CREATE function Get_StrArrayLength
(
@str varchar(1024),  --要分割的字符串
@split varchar(10)  --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end

--调用示例:select dbo.Get_StrArrayLength('78,1,2,3',',')
--返回值:4


二、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便

CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024),  --要分割的字符串
@split varchar(10),  --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1

--这儿存在两种情况:
--1、字符串不存在分隔符号
--2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end

--调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
--返回值:9


三、结合上边两个函数,象数组一样遍历字符串中的元素

declare @str varchar(50)
set @str='1,2,3,4,5'
declare @next int
set @next=1
while @next<=dbo.Get_StrArrayLength(@str,',')
begin
print dbo.Get_StrArrayStrOfIndex(@str,',',@next)
set @next=@next+1
end


调用结果:
1
2
3
4
5

--存在过程的方式实现 功能:
--将[源串@source]以[间隔符@dept]分隔并返回第[位置@pos]个子[目标串]

use pubs
go
create proc get_value
@source    varchar(max),           -- 源串
@dept      char(1),                      -- 间隔符
@Pos       int,                              -- 位置
@dest      varchar(500)  output  -- 目标串
--with encryption
as
begin
select @dest =''

if (@Pos <= 0 or @source = '' or @source is null or @dept ='' or @dept is null)
return  0

declare @index int, @i int
select @index = 1
select @i = 0

--  if left(@source,1) = @dept
--     select @source = right(@source, len(@source)-1) --去掉第一个间隔符号

--  if rigth(@source,1) = @dept
--     select @source = left(@source, len(@source)-1)  --去掉最后一个间隔符号

while(@source <> '')
begin
select @i = charindex(@dept, @source)
if @i = 0
begin
select @i = len(@source) + 1
break
end

if @index = @Pos break

select @source = substring(@source, @i + 1, len(@source))
select @index = @index + 1
end

if @index = @Pos
select @dest = substring(@source, 1, @i - 1)

return 0
end

--用法示例:
/*
declare @khbhs varchar(max)
declare @khbh  varchar(100)
declare @pos   int

select @khbhs = '11000001|11000002|11000003|11000004|11000005'
select @pos = 1
select @khbh = ''

exec get_value @khbhs, '|', @pos, @khbh output

while(@khbh <> '')
begin
select @khbhs as khbhs,@pos as pos, @khbh as khbh
--......
select @pos = @pos+1
exec get_value @khbhs, '|', @pos, @khbh output
end
*/


--表值函数 拆分字符串
dbo.f_splitSTR()
功能:拆分分隔符拆分某个字符串
入参:待分拆的字符串,数据分隔符
出参:单列表 col 分割后的字符串

use pubs
go
create function dbo.f_splitstr
(
@s   varchar(max),     --待分拆的字符串
@split varchar(10)     --数据分隔符
)
returns @re table(col varchar(100))
as
begin
declare @splitlen int
set @splitlen=len(@split+'a')-2
while charindex(@split,@s)>0
begin
insert @re values(left(@s,charindex(@split,@s)-1))
set @s=stuff(@s,1,charindex(@split,@s)+@splitlen,'')
end
insert @re values(@s)
return
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: