繁体   English   中英

在sql server中将数据类型varchar转换为数字时出错

[英]Error converting data type varchar to numeric in sql server

我为 Save InvoicePayment 创建了一个存储过程。 当我尝试执行存储过程时,出现以下错误:

消息 8114,级别 16,状态 5,过程 USP_SaveInvoicePayment_LKO,第 0 行 [批处理起始行 118] 将数据类型 varchar 转换为数字时出错。

ALTER PROC Usp_saveinvoicepayment_lko @RECEIPTNO       VARCHAR(500), 
                                  @INVOICEID       BIGINT, 
                                  @PayableAmount   NUMERIC(10, 2), 
                                  @RECEIPTDT       DATE, 
                                  @PAYMENTMODE     VARCHAR(50), 
                                  @TRANREF         VARCHAR(500), 
                                  @USERID          BIGINT, 
                                  @CHEQUEDATE      DATE, 
                                  @isValid         INT, 
                                  @remark          VARCHAR(100), 
                                  @InvoiceNo       VARCHAR(50), 
                                  @PaymentRecieved VARCHAR(20), 
                                  @PreviousBalance NUMERIC(10, 2), 
                                  @ChequeNumber    VARCHAR(20), 
                                  @PaymentMonth    VARCHAR(20), 
                                  @PaymentDate     DATE, 
                                  @CollectorMobile INT, 
                                  @Latitude        NUMERIC(10, 2), 
                                  @Longitude       NUMERIC(10, 2), 
                                  @RESPONSECODE    INT output, 
                                  @RESPONSEMESSAGE VARCHAR(255) output, 
                                  @IDRESPONSE      VARCHAR(200) output 
AS 
SET nocount ON 

 BEGIN 
  --declare @PRJCD varchar(10),             
  --@KML GEOMETRY   ,       
  --@rowcount int          
  BEGIN try 
      --SELECT @PRJCD=PRJCD FROM PRJMST WHERE ID=@PRJID           
      IF @RECEIPTNO IS NULL 
        BEGIN 
            DECLARE @id_out TABLE 
              ( 
                 id VARCHAR(200) 
              ) 

            --set @ENTRYDATE=getdate()       
            -- select 





convert(varchar,isnull(max(convert(numeric,substring(receiptno,21,50)))+1,1)) 
   from invoicepayment where invoiceid=@invoiceid      
                INSERT INTO invoicepayment_lko 
                            (receiptno, 
                             invoiceid, 
                             payableamount, 
                             receiptdt, 
                             paymentmode, 
                             trnreference, 
                             userid, 
                             entrydate, 
                             chequedate, 
                             isvalid, 
                             remark, 
                             invoiceno, 
                             paymentrecieved, 
                             previousbalance, 
                             chequenumber, 
                             paymentmonth, 
                             paymentdate, 
                             collectormobile, 
                             latitude, 
                             longitude) 
                output      inserted.receiptno 
                INTO @id_out 
                VALUES      ( @INVOICENO + '/REC/' 
                              + (SELECT CONVERT(VARCHAR, Isnull( 
                                        Max(CONVERT(NUMERIC, Substring( 
                                        receiptno, 21, 
                                        50 
                                          ))) 
                                        + 1, 1)) 
                                 FROM   invoicepayment_lko 
                                 WHERE  invoiceid = @invoiceid), 
                              @INVOICEID, 
                              @PayableAmount, 
                              @RECEIPTDT, 
                              @PAYMENTMODE, 
                              @TRANREF, 
                              @USERID, 
                              Getdate(), 
                              @CHEQUEDATE, 
                              @isValid, 
                              @remark, 
                              @InvoiceNo, 
                              @PaymentRecieved, 
                              @PreviousBalance, 
                              @ChequeNumber, 
                              @PaymentMonth, 
                              @PaymentDate, 
                              @CollectorMobile, 
                              @Latitude, 
                              @Longitude) 

                SELECT @IDRESPONSE = id 
                FROM   @id_out 

                SELECT Ident_current(id) 
                FROM   invoicepayment_lko 

                UPDATE invoicedetails 
                SET    balanceamt = balanceamt - @PayableAmount 
                WHERE  id = @INVOICEID 
            END 
          ELSE 
            BEGIN 
                UPDATE invoicepayment_lko 
                SET    chequedate = @CHEQUEDATE, 
                       invoiceid = @INVOICEID, 
                       payableamount = @PayableAmount, 
                       receiptdt = @RECEIPTDT, 
                       paymentmode = @PAYMENTMODE, 
                       trnreference = @TRANREF, 
                       userid = @USERID, 
                       updatedt = Getdate(), 
                       isvalid = @isValid, 
                       remark = @remark, 
                       invoiceno = @InvoiceNo, 
                       paymentrecieved = @PaymentRecieved, 
                       previousbalance = @PreviousBalance, 
                       chequenumber = @ChequeNumber, 
                       paymentmonth = @PaymentMonth, 
                       paymentdate = @PaymentDate, 
                       collectormobile = @CollectorMobile, 
                       latitude = @Latitude, 
                       longitude = @Longitude 
                WHERE  receiptno = @RECEIPTNO 

                SET @IDRESPONSE = @RECEIPTNO 
            END 

          DECLARE @totalPayment NUMERIC(10, 2) 

          SELECT @totalPayment = Sum(payableamount) 
          FROM   invoicepayment_lko 
          WHERE  invoiceid = @invoiceid 
                 AND isvalid = 1 

          SELECT @totalPayment, 
                 @invoiceid 
      END try 

      BEGIN catch 
          SELECT @RESPONSECODE = Error_number(), 
                 @RESPONSEMESSAGE = Error_message(); 

          --set @RESPONSEMESSAGE= @prjid;         
          SELECT @RESPONSECODE, 
                 @RESPONSEMESSAGE 
      END catch 

      IF @RESPONSECODE IS NULL 
        BEGIN 
            IF @isValid = 0 
              BEGIN 
                  SET @RESPONSEMESSAGE = 'Payment marked as Invalid' 
              END 
            ELSE 
              BEGIN 
                  SET @RESPONSEMESSAGE = 'Payment created/Updated 
      Successfully' 
              END 

            SET @RESPONSECODE = 200 
        END 
      END 

    --Execution 
    DECLARE @RESPONSECODE    INT = 20, 
            @RESPONSEMESSAGE VARCHAR(255) = 'Payment Created', 
            @IDRESPONSE      VARCHAR(200) = 'No Response' 

     EXEC Usp_saveinvoicepayment_lko 
      NULL, 
      123, 
      '87.09', 
      '2019-07-11', 
      'Debit', 
      'test', 
      12, 
      '2019-08-11', 
      1, 
      'test', 
      'LP/0819/0000183', 
      'yES', 
      '90.09', 
      '9875', 
      '7', 
      '2019-07-18', 
      988893739, 
      '28.09', 
      '76.09', 
      @RESPONSECODE out, 
      @RESPONSEMESSAGE out, 
      @IDRESPONSE out

请再次检查您的输入。 根据过程中传递的参数

    EXEC Usp_saveinvoicepayment_lko 
      NULL, 
      123, 
      '87.09', 
      '2019-07-11', 
      'Debit', 
      'test', 
      12, 
      '2019-08-11', 
      1, 
      'test', 
      'LP/0819/0000183', 
      'yES', 
      '90.09', 
      '9875', 
      '7', 
      '2019-07-18', 
      988893739,       --- this is one of the reason for your error as you took this as int, but this value will definitly not convert into int.
      '28.09', 
      '76.09', 
      @RESPONSECODE out, 
      @RESPONSEMESSAGE out, 
      @IDRESPONSE out

如果您可以看到电话号码被视为int并且 int 不是您的字段手机号码的正确数据类型,请使用 BigInt 或使用 varchar

我对手机号码字段的建议。

   @CollectorMobile BIGINT  or VARCHAR(15)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM