[示例]存儲過程循環與用戶自定義函數遞歸調用
存儲過程中,循環遍曆臨時表是一個很常見的操作,以下是個簡單的例子:
declare @fl_field nvarchar(20)
-- 定義遊標
declare Temp_Table cursor for
select KdgId from kdg_type -- 查詢結果
-- 打開遊標 取第一行記錄 賦給@fl_field
open Temp_Table
fetch next from Temp_Table into @fl_field
-- 循環開始
while @@fetch_status = 0
begin
-- 邏輯操作...
-- 取下一條記錄
fetch next from Temp_Table into @fl_field
end
-- 循環結束
-- 關閉遊標 刪除遊標引用
close Temp_Table
deallocate Temp_Table
用戶自定義函數的遞歸實現,在樹查詢中較為常見:
/****** 查詢@idValue下的所有子節點的id,用“,”隔開,拚接成字符串 ******/
/****** 返回結果的id排列符合樹結構,即子節點在父節點後 ******/
CREATE function dbo.Fun_GetChildren_KdgTypeData(@idValue varchar(20))
returns varchar(1000)
as
begin
declare @itemId varchar(20)
declare @temp varchar(1000)
set @temp = @idValue
set @itemId = @idValue
declare Temp_Table cursor for
select KdgTypeId from kdg_typedata where IsDelete=0 and KdgParentId=@itemId -- 查詢@itemId的子節點
open Temp_Table
fetch next from Temp_Table into @itemId
-- 若@itemId不存在子節點
if @itemId is null or @itemId = ''
set @temp = @temp + @itemId -- 字符串拚接id + , + id
else
begin
while @@fetch_status = 0
begin
set @temp = @temp + ',' + dbo.Fun_GetChildren_KdgTypeData(@itemId) -- 遞歸
fetch next from Temp_Table into @itemId
end
close Temp_Table
deallocate Temp_Table
end
return @temp
end
/****** 返回結果的id排列符合樹結構,即子節點在父節點後 ******/
CREATE function dbo.Fun_GetChildren_KdgTypeData(@idValue varchar(20))
returns varchar(1000)
as
begin
declare @itemId varchar(20)
declare @temp varchar(1000)
set @temp = @idValue
set @itemId = @idValue
declare Temp_Table cursor for
select KdgTypeId from kdg_typedata where IsDelete=0 and KdgParentId=@itemId -- 查詢@itemId的子節點
open Temp_Table
fetch next from Temp_Table into @itemId
-- 若@itemId不存在子節點
if @itemId is null or @itemId = ''
set @temp = @temp + @itemId -- 字符串拚接id + , + id
else
begin
while @@fetch_status = 0
begin
set @temp = @temp + ',' + dbo.Fun_GetChildren_KdgTypeData(@itemId) -- 遞歸
fetch next from Temp_Table into @itemId
end
close Temp_Table
deallocate Temp_Table
end
return @temp
end
[轉載]數據庫split函數的實現:
-- @SourceSql 需要分割的字符串
-- @StrSeprate 分隔符
create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--實現split功能 的函數
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
-- @StrSeprate 分隔符
create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--實現split功能 的函數
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
用法:select * from dbo.f_split('aaa,bbb,ccc,ddd,eee',',')
結果:
最後更新:2017-04-02 00:06:46