这是我第一次学着写存储过程,虽然完成了目标,但不知道是否有更好的写法
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
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
浙公网安备 33010602011771号