SQL Server存储过程创建具有不同日期的相同序列号文件

时间:2018-01-31 02:39:15

标签: sql sql-server sql-server-2008 stored-procedures ssis

我有一个SQL Server存储过程,它是SSIS包的一部分,每天生成一个.txt文件,序列号不同。例如 FileName01 30 2018 514 ,第二天将是FileName01 31 2018 515 ......

存储过程中的HeaderNumber生成文件结束序列号,如514,515,516 ...

我的问题:当天没有数据生成文件时,如FileName01 30 2018 514 ,零记录。第二天,当我们有数据时,文件就像FieName01 31 2018 514 一样生成。请注意结尾的数字是相同的" 514。"但它应该在第二天515结束。

如何修改存储过程,以便每天产生不同的结束序列号,如514,515,516?

 ALTER PROCEDURE [outboundprocess].[usp_BdsExportStatusUpdate]
     @vFileName VARCHAR(500), 
     -- @[User::vFileName]  --default for testing
     @HeaderNumber VARCHAR(250) OUTPUT,
     @HeaderFooter VARCHAR(250) OUTPUT
 AS
 BEGIN
     SET NOCOUNT ON

     DECLARE @sDatetime VARCHAR(50),
             @ModifiedDate DATETIME = GETDATE(),
             @iFileCounter INTEGER,
             @sFileCounter VARCHAR(50) 

     DECLARE @ErrCode INT, @ErrDesc VARCHAR(8000)   

     BEGIN TRY
         SET @iFileCounter = (SELECT MAX(ISNULL(HeaderNumber, 0)) 
                              FROM solix.BdsLog) + 1
         IF @iFileCounter > 999 
         BEGIN
             UPDATE solix.BdsLog 
             SET HeaderNumber = 0

             SET @iFileCounter = 1
         END    

         SET @sFileCounter = FORMAT(@iFileCounter, '000') -- SELECT @sFileCounter

         UPDATE dbo.Customers 
         SET ModifiedBy = 'BDSExport.dtsx',
             ModifiedDate = @ModifiedDate,
             BDSFileStatus = CASE 
                                WHEN C.StatusID = 130 
                                   THEN 'D' 
                                   ELSE 'S' 
                             END  --means sent to BDS,
         FROM dbo.Customers C 
         INNER JOIN Solix.BdsLog B ON LEFT( C.AccountNumber, 10) = B.AccountNumberL10
                                   AND B.CustCreateDate = C.CreateDate
         WHERE BdsSubmitStatus = 'ReadyToSend' 

         UPDATE Solix.BdsLog
         SET ModifiedBy = 'BDSExport.dtsx',
             ModifiedDate = @ModifiedDate,
             BdsSubmitStatus = 'Sended',
             BdsExportFileName = @vFileName,
             HeaderNumber = @iFileCounter
         WHERE 
             BdsSubmitStatus = 'ReadyToSend' 

         DECLARE @sHeaderNumber VARCHAR(250),
                 @sFooterNumber VARCHAR(250),
                 @iRecordCounter INTEGER,
                 @sRecordCounter VARCHAR(50)  


SET @iRecordCounter=(SELECT COUNT( Solix.BdsLog.BdsLogIdentity) FROM  
Solix.BdsLog WHERE ModifiedDate=@ModifiedDate AND 
BdsExportFileName=@vFileName)
SET @sRecordCounter=FORMAT(@iRecordCounter,'000000000') --SELECT 
@sRecordCounter

SET @sDatetime = FORMAT(GETDATE(),'yyyyMMddHHmm') -- SELECT @sDatetime

SET @sHeaderNumber=@sDatetime+'SOLIX ' +'TJRL11'+ @sFileCounter
SET @sFooterNumber=@sHeaderNumber

SET @sHeaderNumber='M$9001'+@sHeaderNumber+ REPLICATE(' ',36)+'2'
SET @sFooterNumber='M$9002'+@sFooterNumber+ REPLICATE(' 
',15)+ISNULL(@sRecordCounter,0)+ REPLICATE(' ',12)+'2'

--OUTPUT--------------------------------------------------------------------
-----------------------------------
SET @HeaderNumber=@sHeaderNumber
SET @HeaderFooter=@sFooterNumber 

END TRY

===========================================================
--CATCH Errors
--================================================================
BEGIN CATCH         
    DECLARE @ErrorNumber INT,
            @ErrorSeverity INT,             
            @ErrorState INT,            
            @ErrorProcedure VARCHAR(8000),
            @ErrorLine INT,                     
            @ErrorMessage VARCHAR(8000)

    SELECT
        @ErrorNumber = ERROR_NUMBER(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE(),
        @ErrorProcedure = ERROR_PROCEDURE(),
        @ErrorLine = ERROR_LINE(),
        @ErrorMessage = ERROR_MESSAGE()

        SET @ErrCode = @ErrorNumber  
        SET @ErrDesc = @ErrorMessage  

        SELECT @ErrDesc 


END CATCH       

END

2 个答案:

答案 0 :(得分:0)

该号码存储在@iFileCounter中,并存储在Solix.BdsLog的HeaderNumber列中。它由此声明更新

UPDATE       Solix.BdsLog
SET     
    ModifiedBy='BDSExport.dtsx',
    ModifiedDate=@ModifiedDate,
    BdsSubmitStatus = 'Sended',
    BdsExportFileName=@vFileName,
    HeaderNumber=@iFileCounter
    WHERE BdsSubmitStatus='ReadyToSend' 

由于where子句,此更新仅在BdsSubmitStatus为" ReadyToSend"时发生,如果文件为空,则不一定是。即使文件未发送,您也需要更新日志(或至少更新HeaderNumber)。在这种情况下,您可能还需要修改BdsSubmitStatus。这样的事情应该有效

UPDATE       Solix.BdsLog
SET     
    ModifiedBy='BDSExport.dtsx',
    ModifiedDate=@ModifiedDate,
    BdsSubmitStatus = CASE WHEN BdsSubmitStatus='ReadyToSend' THEN'Sended' ELSE 'FileEmpty' END,
    BdsExportFileName=@vFileName,
    HeaderNumber=@iFileCounter
    WHERE BdsSubmitStatus IN ('ReadyToSend', 'EmptyFileStatusHere')

您需要在where子句中找出​​并设置正确的空文件状态,或者如果没有其他状态需要担心,您可以完全删除WHERE子句。

您应该确保没有其他进程读取此日志文件来控制进程,如果您更新数字且没有文件,则会中断。

答案 1 :(得分:0)

设置开始日期,并查找与当前日期的日期差异。 然后,您可以获得唯一的增量编号。

例如,如果您昨天已经开始此过程,那么硬编码将该日期作为开始日期,并找到与当前日期的日期差异。

Declare @start_date Date, @inc_no int
Set @start_date = '30-Jan-2018'
Set @inc_no = DATEDIFF(day,@start_date,convert(date,getdate()))
print @inc_no 

然后使用您的文件名附加@inc_no。