[**]
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 行)
二、按指定符號分割字串,返回分割後的元素個數,方法很簡單,就是看字串中存在多少個分隔符號,然後再加一,就是要求的結果。
create function get_strarraylength
( @str varchar(1024), --要分割的字串
@split varchar(10) --分隔符號
)returns int
asbegin
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
endreturn @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)
asbegin
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
endif @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呼叫結果:12
345
但是真要用到查詢語句裡面可就比較麻煩了,例如
表t1col1
col2
a美國,法國,英國,美國,日本,南韓,日本
b朝鮮,緬甸,緬甸
我想得到的結果是
col1
col2a美國
a法國a英國
a日本a南韓
b朝鮮b緬甸
例如我去引用函式
select col1,col2=(select col from f_split(col2,',')) from t1
他就會報乙個錯誤
子查詢返回的值不止乙個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表示式時,這種情況是不允許的。
SQL分割字串
if object id dbo.fn split isnot null drop function dbo.fn split gocreate function dbo.fn split inputstr varchar 8000 seprator varchar 10 returns temp ...
SQL 字串分割函式
create function dbo f split sourcesql varchar 8000 strseprate varchar 10 returns temp table a varchar 100 as begin declare iint set sourcesql rtrim lt...
SQL分割字串儲存
create function dbo.fn pmt pis splitstr sourcesql varchar 8000 strseprate varchar 10 returns temp table customer int as begin declare i int set source...