我有一个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
答案 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。