Fromdate 和 ToDate 列不返回值

Values are not returned for Fromdate and ToDate columns

我已经为批量发票生成创建了一个存储过程。在执行存储过程时,成功返回了除 FromDateToDate 之外的所有列的值。对于这两列,显示 NULL 个值。

这是我创建的程序。请让我知道我在这里做错了什么?

SET @fromDt =  CONVERT(VARCHAR, DATEADD(d, -(DAY(DATEADD(m, -1, @currentdate - 2))), DATEADD(m, -1, @currentdate - 1)), 106)   

ALTER PROCEDURE Bulkinvoicegeneration_lko 
    @InvoiceMonth VARCHAR(20), 
    @PrjId        BIGINT, 
    @CustomerId   NVARCHAR(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @fromDt      DATETIME, 
            @monthdays   INT, 
            @ToDate      DATETIME, 
            @Currentdate DATETIME, 
            @Year        INT 

    SET @currentdate = CONVERT(VARCHAR, @Year) + '-' 
                       + CONVERT(VARCHAR, @InvoiceMonth) + '-11' 
    SET @fromDt = CONVERT(VARCHAR, DATEADD(d, - (DAY(DATEADD(m, -1, @currentdate - 2))), DATEADD(m, -1, @currentdate - 1)), 106) 
    SET @ToDate = CONVERT(DATE, Dateadd(d, -(Day(@currentdate)), @currentdate)) 
    SET @monthdays = DATEDIFF(d, @fromDt, @ToDate) + 1 

    SELECT * 
    INTO #consumerdata1 
    FROM  
        (SELECT 
             id, prjid, customerid, ucccatid, area, rate, 
             billingamount AS TotalAmt, 
             billingamount AS SubTotalAmt 
         FROM
             consumermst_lko 
         WHERE  
              1 = 2) AS aa 

     BEGIN 
         INSERT INTO #consumerdata1 
             SELECT 
                 prjid, customerid, ucccatid, area, rate, 
                 billingamount AS TotalAmt, 
                 billingamount AS SubTotalAmt 
             FROM   
                 consumermst_lko 
    END 

    ALTER TABLE #consumerdata1 
        ADD invoiceno VARCHAR(20), invoicedate DATE, duedate DATE, 
            balanceamt NUMERIC(10, 2), roundoff NUMERIC(10, 2),  
            entrydate DATE, fromdate DATE, todate DATE, 
            userid INT, deleteflag INT, responsecode INT, 
            responsemessage VARCHAR(500), invoiceno_response VARCHAR(500) 

    UPDATE #consumerdata1 
    SET entrydate = Getdate() 

    UPDATE #consumerdata1 
    SET userid = 2 

    UPDATE #consumerdata1 
    SET balanceamt = 20 

    --update  #CONSUMERDATA set billingdays = 30   
    UPDATE #consumerdata1 
    SET invoiceno = NULL, 
        invoicedate = CONVERT(DATE, GETDATE() - 1), 
        duedate = DATEADD(d, 15, CONVERT(DATE, GETDATE())), 
        roundoff = 0, 
        deleteflag = 0 

  DECLARE @id          BIGINT, 
          @InvoiceNo   NVARCHAR(150), 
          @InvoiceDate DATE, 
          @DueDate     DATE, 
          @UccCatId    BIGINT, 
          @rate        NUMERIC(10, 2), 
          @Area        NUMERIC(10, 2), 
          @TotalAmt    NUMERIC(10, 2), 
          @BalanceAmt  NUMERIC(10, 2), 
          @SubTotalAmt NUMERIC(10, 2), 
          @RoundOff    NUMERIC(10, 2), 
          @EntryDate   DATE, 
          @FromDate    DATE, 
          @UserId      BIGINT, 
          @deleteflag  INT, 
          @RESPONSECODE       INT, 
          @RESPONSEMESSAGE    VARCHAR(255), 
          @INVOICENO_RESPONSE VARCHAR(20) 

    SET @prjid = 2 

    DECLARE consmr_cursor1 CURSOR FOR 
        SELECT 
            id, prjid, customerid, ucccatid, area, rate, 
            totalamt, subtotalamt, invoiceno, invoicedate, duedate, 
            balanceamt, roundoff, entrydate, fromdate, todate, 
            userid, deleteflag, responsecode, responsemessage, 
            invoiceno_response 
        FROM   
            #consumerdata1 

    OPEN consmr_cursor1 

    FETCH NEXT FROM consmr_cursor1 
          INTO @Id, @PrjId, @CustomerId, @UccCatId, @Area, @rate, @TotalAmt, @SubTotalAmt, @InvoiceNo, @InvoiceDate, @DueDate, 
               @BalanceAmt, @RoundOff, @EntryDate, @FromDate, @ToDate, @UserId, @deleteflag,
               @ResponseCode, @ResponseMessage, @INVOICENO_RESPONSE 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        EXEC [dbo].[Demoinvoice] 
             @Id = @Id, 
             @InvoiceNo =@InvoiceNo, 
             @PrjId = @PrjId,  
             @CustomerId = @CustomerId, 
             @InvoiceDate = @InvoiceDate, 
             @InvoiceMonth = @InvoiceMonth, 
             @DueDate = @DueDate, 
             @UccCatId = @UccCatId, 
             @Rate = @Rate, 
             @Quantity = @Area, 
             @TotalAmt = @TotalAmt, 
             @BalanceAMT = @BalanceAmt, 
             @SubTotalAmt = @SubtotalAmt, 
             @RoundOff = @RoundOff, 
             @EntryDate = @EntryDate, 
             @FromDate = @FromDate, 
             @ToDate = @ToDate, 
             @UserId = @UserId, 
             @deleteflag = @deleteflag, 
             @RESPONSECODE = @RESPONSECODE, 
             @RESPONSEMESSAGE = @RESPONSEMESSAGE output, 
             @INVOICENO_RESPONSE = @INVOICENO_RESPONSE output 

        UPDATE #consumerdata1 
        SET responsecode = @RESPONSECODE, 
            responsemessage = @RESPONSEMESSAGE, 
            invoiceno_response = @INVOICENO_RESPONSE 
        WHERE customerid = @CustomerId 

        FETCH NEXT FROM consmr_cursor1 
              INTO @Id, @PrjId, @CustomerId, @UccCatId, @Area, @rate, @TotalAmt, @SubTotalAmt, @InvoiceNo, @InvoiceDate, 
                   @DueDate, @BalanceAmt, @RoundOff, @EntryDate, @FromDate, @ToDate, @UserId, @deleteflag,
                   @ResponseCode, @ResponseMessage, @INVOICENO_RESPONSE 
    END 

    CLOSE consmr_cursor1 
    DEALLOCATE consmr_cursor1 

    SELECT * 
    FROM #consumerdata1
    -- WHERE @RESPONSECODE <> 200     
END 

  EXECUTE Bulkinvoicegeneration_lko 
  1, 
  2, 
  'LKO00066801'

我注意到的一件事是您在使用变量@year 之前没有对其进行初始化。

如果要设置为当前年份,可以

SET @Year = year(getdate())

在此过程中添加年份参数。

ALTER PROCEDURE Bulkinvoicegeneration_lko @InvoiceMonth VARCHAR(20), 
                                      @PrjId        BIGINT, 
                                      @CustomerId   NVARCHAR(50),
                                      @InvoiceYear INT

然后SET @Year = @InvoiceYear

或设置您的 @Year INT = 2019

检查程序中的这一部分

DECLARE @fromDt      DATETIME, 
        @monthdays   INT = 10, 
        @ToDate      DATETIME, 
        @Currentdate DATETIME, 
        @Year        INT ,      ---- you need to pass some value over there
        @InvoiceMonth varchar(50) = '1'   --- this is passed as parameter from your procedure

SET @currentdate = CONVERT(VARCHAR, @Year) + '-' 
                   + CONVERT(VARCHAR, @InvoiceMonth) + '-11' 

Select @currentdate    ---- this value is NULL, since @Year is not passed.

由于您使用 @currentdate 生成 @frmdt@todt,因此它们也是 NULL

DECLARE @fromDt      DATETIME, 
        @monthdays   INT = 10, 
        @ToDate      DATETIME, 
        @Currentdate DATETIME, 
        @Year        INT = 2019,      
        @InvoiceMonth varchar(50) = '1'   --- this is passed as parameter from your procedure

SET @currentdate = CONVERT(VARCHAR, @Year) + '-' 
                   + CONVERT(VARCHAR, @InvoiceMonth) + '-11' 

Select @currentdate    ---- this value is '2019-01-11 00:00:00.000'.

---- After that


SET @fromDt = CONVERT(VARCHAR, DATEADD(d, - (DAY(DATEADD(m, -1, @currentdate - 2))), DATEADD(m, -1, @currentdate - 1)), 106) 
SET @ToDate = CONVERT(DATE, Dateadd(d, -(Day(@currentdate)), @currentdate)) 
SET @monthdays = DATEDIFF(d, @fromDt, @ToDate) + 1

结果

   frmdt                        toDate                  Monthdays
 2018-12-01 00:00:00.000    2018-12-31 00:00:00.000     31

更新您的代码以设置此 @currentdate 一旦完成希望块的其余部分适合您.... ;)