SQL SERVER 儲存過程和自定義函式
一、功能描述。
需要把 participants 轉換成中文顯示,相關資訊的表如下:
二、自定義函式,作用是解釋用 ;分割的參與者編號,如下:
USE [schedule]GO
/****** Object: UserDefinedFunction [dbo].[SplitStrFun] Script Date: 02/22/2017 15:49:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--drop function SplitStrFun;
ALTER function [dbo].[SplitStrFun](@AccountString varchar(max),@SplitChar varchar(10))
returns varchar(100)
as
begin
declare @Account int
declare @SplitCharPos int
declare @ptxt varchar(20)
declare @ptxts varchar(200)
set @SplitCharPos = 0;
select @SplitCharPos = CHARINDEX(@SplitChar, @AccountString)
if @SplitCharPos = 0
begin
select @Account = @AccountString
--select @Account as Account
end
else
begin
while @SplitCharPos <> 0
begin
select @SplitCharPos = CHARINDEX(@SplitChar, @AccountString)
if @SplitCharPos = 0
begin
select @Account = @AccountString
end
else
begin
select @Account = LEFT(@AccountString, @SplitCharPos - 1)
select @AccountString = RIGHT(@AccountString, len(@AccountString)-len(@Account) - 1)
end
select @ptxt = E.EMPNAME from dbo.ORG_EMPLOYEE E WHERE E.EMPID = @Account
if @ptxts is null
set @ptxts = @ptxt
else
set @ptxts = @ptxts + ';' + @ptxt
end
end
return @ptxts
end
三、儲存過程、呼叫自定義的函式,生成臨時表,如下:
USE [schedule]
GO
/****** Object: StoredProcedure [dbo].[FetchProc] Script Date: 02/22/2017 15:50:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[FetchProc]
as
begin
declare @result varchar(200)
declare @pitem varchar(100)
declare @curlib int
declare curCursor Cursor for
select a.participants,a.id from MLPLAN a left join leadcompany l on a.lid = l.id
Open curCursor
begin
if exists(select * from sysobjects where id = object_id('schedule.dbo.participant_temp'))
drop table schedule.dbo.participant_temp
create table schedule.dbo.participant_temp(
lid int not null,
participants varchar(400) not null
)
end
Fetch Next From curCursor Into @pitem,@curlib
While (@@Fetch_Status=0)
begin
set @result = dbo.SplitStrFun(@pitem,';')
insert into schedule.dbo.participant_temp values(@curlib,@result)
Fetch Next From curCursor into @pitem,@curlib
end
Close curCursor
Deallocate curCursor
end
四、最終效果,如下:
exec FetchProc -- 執行儲存過程
select a.createtime,a.address,a.content, (select participants from participant_temp t where a.id = t.lid) participants ,a.lid,a.type,a.remark from MLPLAN a left join leadcompany l on a.lid = l.id