1. 程式人生 > >SQL SERVER 儲存過程和自定義函式

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