转载地址:http://www.blogjava.net/supercrsky/articles/260998.html
T-SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。
一,用临时表作为数组。
create
function f_split(
@c
varchar(
2000),
@split
varchar(
2))
returns
@t
table(col
varchar(
20))
as
begin
while(
charindex(
@split,
@c)
<>
0)
begin
insert
@t(col)
values (
substring(
@c,
1,
charindex(
@split,
@c)
-
1))
set
@c
=
stuff(
@c,
1,
charindex(
@split,
@c),
'')
end
insert
@t(col)
values (
@c)
return
end
go
select
*
from dbo.f_split(
'
dfkd,dfdkdf,dfdkf,dffjk
',
'
,
')
drop
function f_split

col
--
------------------

dfkd

dfdkdf

dfdkf

dffjk
(所影响的行数为 4 行)
二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。
调用示例:
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
//
--
-----------------------------------------------------------------------------------------------------------------------
select f1,f2,f3,
left(A,
charindex(
'
_
',A)
-
1)
from 表名
order
by
left(A,
charindex(
'
_
',A)
-
1)