【问题标题】:In Trigger getting error as error converting data type varchar to numeric在 Trigger getting error as error conversion data type varchar to numeric
【发布时间】:2016-11-14 06:03:10
【问题描述】:

我有一个触发器,它之前工作得很好。但后来,根据需要,我在下面添加了更多行

declare @imkey numeric(10,0);declare @xmkey numeric(10,0); declare @xsrno numeric(10,0)
            select  @xmkey=max([Mkey])+1, @xsrno=max([Entry_Sr_No])+1 
            from erp190516.[dbo].[Inward_Doc_Tracking_Trl] where Ref_Mkey=@imkey;
            select @imkey=i.Inward_ref_key from inserted i 

            insert into erp190516.[dbo].[Inward_Doc_Tracking_Trl]
            SELECT  @xmkey,@xsrno,[N_UserMkey],'1' [N_Department], 'F' [CStatus_Flag]
            ,'Requester' [Remarks],'1' [CUser_ID],getdate() [U_Datetime],
            ,'N' [NStatus_Flag], 'N' [Delete_Flag]
            ,'1'[CDept_Id],[Ref_Mkey],[No_Of_Days],[Approved_Amount],[Chq_No],[Chq_dated]
            ,[Chq_Bank],[Chq_Amount],[Vendor_MKey],[Vendor_Comp_Mkey]
            ,[Project_Mkey],[Program_mkey],[Payment_MKey],[Due_Date],[Updated_Remarks]
            ,[Updated_Bill_no],[Updated_Bill_Date],[Updated_Bill_Amt]
            ,[Party_Name],[Acc_mkey],[TotalDeductions],[Broker_Mkey],[Customer_Mkey]
            ,[Payable_Amt],[Balance_Amt],[Receipt_No],[Po_No],[Bill_No]
            ,[Disp_through],[Disp_Through_Name],[Site_Id]
        FROM erp190516.[dbo].[Inward_Doc_Tracking_Trl] where Ref_Mkey=@imkey

它执行得很完美,但是在将数据插入表中时出现错误

将数据类型 varchar 转换为数值时出错

表定义

CREATE TABLE [dbo].[Inward_Doc_Tracking_Trl](
            [Mkey] [numeric](18, 0) NOT NULL,
            [Entry_Sr_No] [numeric](4, 0) NOT NULL,
            [N_UserMkey] [numeric](10, 0) NULL,
            [N_Department] [numeric](10, 0) NULL,
            [CStatus_Flag] [numeric](8, 0) NOT NULL,
            [Remarks] [varchar](500) NULL,
            [CUser_ID] [numeric](10, 0) NOT NULL,
            [U_Datetime] [datetime] NOT NULL,
            [NStatus_Flag] [numeric](10, 0) NOT NULL,
            [Delete_Flag] [char](1) NULL,
            [CDept_Id] [numeric](10, 0) NOT NULL,
            [Ref_Mkey] [numeric](18, 0) NULL,
            [No_Of_Days] [int] NULL,
            [Approved_Amount] [float] NULL,
            [Chq_No] [varchar](50) NULL,
            [Chq_dated] [datetime] NULL,
            [Chq_Bank] [varchar](40) NULL,
            [Chq_Amount] [float] NULL,
            [Vendor_MKey] [int] NULL,
            [Vendor_Comp_Mkey] [int] NULL,
            [Project_Mkey] [numeric](10, 0) NULL,
            [Program_mkey] [numeric](10, 0) NULL,
            [Payment_MKey] [int] NULL,
            [Due_Date] [datetime] NULL,
            [Updated_Remarks] [varchar](500) NULL,
            [Updated_Bill_no] [varchar](27) NULL,
            [Updated_Bill_Date] [datetime] NULL,
            [Updated_Bill_Amt] [float] NULL,
            [Party_Name] [varchar](80) NULL,
            [Acc_mkey] [numeric](10, 0) NULL,
            [TotalDeductions] [float] NULL,
            [Broker_Mkey] [numeric](10, 0) NULL,
            [Customer_Mkey] [numeric](10, 0) NULL,
            [Payable_Amt] [float] NULL,
            [Balance_Amt] [float] NULL,
            [Receipt_No] [varchar](50) NULL,
            [Po_No] [varchar](50) NULL,
            [Bill_No] [varchar](50) NULL,
            [Oracle_doc_no] [varchar](100) NULL,
         CONSTRAINT [PK_Inward_Doc_Tracking_Trl_1] PRIMARY KEY CLUSTERED 
        (
            [Mkey] ASC,
            [Entry_Sr_No] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]

        GO

        SET ANSI_PADDING OFF
        GO

        ALTER TABLE [dbo].[Inward_Doc_Tracking_Trl] ADD  CONSTRAINT [DF_Inward_Doc_Tracking_Trl_U_Datetime]  DEFAULT (getdate()) FOR [U_Datetime]
        GO

        ALTER TABLE [dbo].[Inward_Doc_Tracking_Trl] ADD  CONSTRAINT [DF__Inward_Do__Delet__47FED732]  DEFAULT ('N') FOR [Delete_Flag]
        GO

【问题讨论】:

  • 在[U_Datetime]之后,有2个逗号
  • 您能分享一下表格的定义吗?
  • 可能与您当前的问题无关(这似乎是一个简单的数据类型不匹配,您不能指望 us 在不知道您的表定义的情况下解决)但您的触发器似乎有两个错误-首先,您的第一个选择似乎在将@imkey 设置为一个值之前使用了它,其次,第二个选择假定inserted 恰好包含 one 行。这不是一个安全的假设。应编写触发器以针对可以包含 0、1 或 多个 行的 inserted 表。
  • @Mureinik:在问题中添加了定义
  • 不,您可能没有发布所有代码,但select @imkey=i.Inward_ref_key from inserted i 绝对是错误,因为正如我所说,inserted 可以包含 多个 行。此外,如果您没有发布所有代码,但您仍然发布 multiple 语句,那么您如何将问题隔离到 这些 语句但无法将其隔离为 single 语句?

标签: sql sql-server sql-server-2005 triggers


【解决方案1】:

您在 [NStatus_Flag] 和 [CStatus_Flag] 中插入字符值,只需更改它们在表中的数据类型或将带有数值的数据插入其中。

【讨论】:

    【解决方案2】:

    嗯 - 一个明显的错误是你有 [CStatus_Flag] [numeric](8, 0) 但选择 'F' [CStatus_Flag]

    也只是为了清楚起见,但你也不应该写'1' 来选择数字字段,因为1 可以在没有转换的情况下做到这一点。

    【讨论】:

    • 我把它从F改成了0。但我在保存时仍然出错
    • 当您遇到这样的数据类型不匹配时,可能会出现更多相同的错误。您需要通过您的选择并确保它选择与您要插入的表相同的数据类型,因为显然它没有。
    • 有 2 个地方我需要进行更改,我做到了,并且成功了
    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 2022-12-02
    • 2022-12-19
    • 2021-01-30
    • 2022-12-19
    • 1970-01-01
    • 2022-12-02
    • 2021-01-07
    相关资源
    最近更新 更多