【问题标题】:Values are not returned for Fromdate and ToDate columnsFromdate 和 ToDate 列不返回值
【发布时间】:2019-12-12 15:05:57
【问题描述】:

我为批量发票生成创建了一个存储过程。在执行存储过程时,成功返回除FromDateToDate 之外的所有列的值。对于这 2 列,正在显示 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'

【问题讨论】:

  • SET @fromDt 声明的目的是什么?它在您的stored procedure 之外。而且我根本没有看到任何declare @fromDt
  • 是的。我已经对此进行了更改,但仍然没有返回从日期到日期的值。
  • 您在查询的哪一部分更新了fromdatetodate 的值?

标签: sql sql-server stored-procedures cursor


【解决方案1】:

在您的程序中检查此部分

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 完成后希望该块的其余部分适合您.... ;)

【讨论】:

    【解决方案2】:

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

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

    SET @Year = year(getdate())
    

    【讨论】:

      【解决方案3】:

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

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

      然后SET @Year = @InvoiceYear

      或设置您的@Year INT = 2019

      【讨论】:

      • 但是我在执行的过程中没有任何 InvoiceYear 参数。@donic
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多