Sady Home

Note my coding life

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
这是我第一次学着写存储过程,虽然完成了目标,但不知道是否有更好的写法

CREATE PROCEDURE [dbo].[spForecast_ForeCast_YearlyReport] 
 
@sFC_Period  VARCHAR(6)
AS
 
SET NOCOUNT ON;
 
 
DECLARE @SQL  NVARCHAR(4000)
 
DECLARE @SQL1  NVARCHAR(2000)
 
DECLARE @SQL2  NVARCHAR(2000)
 
DECLARE @Month  DATETIME
 
DECLARE @i  INT

 
SET @Month=CONVERT(DATETIME,LEFT(@sFC_Period,4)+'-'+RIGHT(@sFC_Period,2)+'-01')
 
SET @i=1
 
SET @SQL=N'SELECT A.*,'
 
SET @SQL1=''
 
SET @SQL2=''

 
WHILE @i<13  
 
BEGIN  
  
IF DATEADD(m,@i,@Month)>=getDate()
   
IF @i<10
    
BEGIN
     
SET @SQL1=@SQL1+'N'+CONVERT(CHAR(1),@i)+'.Qty_Open AS Qty_M0'+CONVERT(CHAR(1),@i)+','
     
SET @SQL2=@SQL2+'LEFT OUTER JOIN FORECAST_BACKLOG N'+CONVERT(CHAR(1),@i)+' ON A.CustomerCode=N'+CONVERT(CHAR(1),@i)+'.CustomerCode '
    
END
   
ELSE
    
BEGIN
     
SET @SQL1=@SQL1+'N'+CONVERT(CHAR(2),@i)+'.Qty_Open AS Qty_M'+CONVERT(CHAR(2),@i)+','
     
SET @SQL2=@SQL2+'LEFT OUTER JOIN FORECAST_BACKLOG N'+CONVERT(CHAR(2),@i)+' ON A.CustomerCode=N'+CONVERT(CHAR(2),@i)+'.CustomerCode '
    
END
  
ELSE
   
IF @i<10
    
BEGIN
     
SET @SQL1=@SQL1+'N'+CONVERT(CHAR(1),@i)+'.Qty_Actual AS Qty_M0'+CONVERT(CHAR(1),@i)+','
     
SET @SQL2=@SQL2+'LEFT OUTER JOIN FORECAST_ACTUALSALES N'+CONVERT(CHAR(1),@i)+' ON A.CustomerCode=N'+CONVERT(CHAR(1),@i)+'.CustomerCode '
    
END
   
ELSE
    
BEGIN
     
SET @SQL1=@SQL1+'N'+CONVERT(CHAR(2),@i)+'.Qty_Actual AS Qty_M'+CONVERT(CHAR(2),@i)+','
     
SET @SQL2=@SQL2+'LEFT OUTER JOIN FORECAST_ACTUALSALES N'+CONVERT(CHAR(2),@i)+' ON A.CustomerCode=N'+CONVERT(CHAR(2),@i)+'.CustomerCode '
    
END
  
SET @i=@i+1
 
END
 
 
SET @SQL=@SQL+@SQL1+'D.Region FROM FORECAST_12M  A '+@SQL2+' LEFT OUTER JOIN FORECAST_CUSTOMER D ON A.CustomerCode=D.CustomerCode WHERE A.FC_Period=@FC_Period'
 
 
EXEC sp_executesql @SQL,N'@FC_Period VARCHAR(6)',@sFC_Period
GO
posted on 2007-10-09 14:42  Sady  阅读(259)  评论(0)    收藏  举报
凭飞堂