【问题标题】:Stored Procedure Data Type Conversion Error存储过程数据类型转换错误
【发布时间】:2019-11-30 07:47:53
【问题描述】:

我尝试执行以下 SP,它给了我以下错误。

消息 8114,级别 16,状态 5,程序测试,第 55 行 [批处理开始行 12] 将数据类型 nvarchar 转换为 bigint 时出错。

我尝试在将 insert 传递给值时强制转换该值,但仍然给出相同的错误。

表包含doc_idBIGINT 和line_idINT

When I set @doc_id VARCHAR(100)  = NULL and @line_id  VARCHAR(100) = NULL 

仍然打印

消息 8114,级别 16,状态 5,程序测试,第 55 行 [批处理开始行 12] 将数据类型 nvarchar 转换为 bigint 时出错。

以下是我创建的程序。

ALTER PROCEDURE [dbo].[TEST] 

    @companycode VARCHAR(100)  = NULL,
    @division VARCHAR(100)  = NULL,
    @doc_id BIGINT  = NULL,
    --@doc_id VARCHAR(100)  = NULL,
    @doc_type_id VARCHAR(100)  = NULL,  
    @fileid VARCHAR(100)  = NULL,   
    @line_id INT  = NULL,
    --@line_id  VARCHAR(100) = NULL,
    @m3UpdateStatus VARCHAR(100)  = NULL,
    @m3VoucherNo VARCHAR(100)  = NULL,
    @posted_by VARCHAR(100)  = NULL,
    @post_priority VARCHAR(100)  = NULL,
    @samsung_doc_no VARCHAR(100)  = NULL,
    @serp_doctype VARCHAR(100)  = NULL,
    @serp_status_id VARCHAR(100)  = NULL,
    @year VARCHAR(100)  = NULL,
    @period VARCHAR(100)  = NULL,
    @transactionType VARCHAR(100)  = NULL

    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    print 1
    DECLARE db_cursor CURSOR FOR 
    SELECT [doc_id] --@doc_id
          ,[samsung_doc_no] --@samsung_doc_no
          ,[posted_by] --@posted_by
          ,[post_priority] --@post_priority
          ,[serp_status_id] --@serp_status_id
          ,[line_id] --@line_id
          ,[fileid] --@fileid
          ,[serp_doctype] --@serp_doctype
          ,[doc_type_id] --@doc_type_id
          ,[companycode] --@companycode
          ,[m3VoucherNo] --@m3VoucherNo
          ,[m3UpdateStatus] --@m3UpdateStatus
          ,[division] --@division
          ,[year] --@year
          ,[period] --@period
          ,[transactionType] --@transactionType
      FROM [dbo].[post]
      LEFT JOIN [dbo].[DM] ON [dbo].[DM].[BA] = [dbo].[post].[serp_doctype]
      WHERE [dbo].[DM].[DT] = '2' AND [dbo].[post].[serp_status_id] = 'TEST'
       AND  [dbo].[post].[serp_post_id] IN (4,3,2,1,0)
    print 2

    Declare @now datetime = getdate();

    OPEN db_cursor  
    print 3
    FETCH NEXT FROM db_cursor INTO @companycode,@division,@doc_id,@doc_type_id,@fileid,@line_id,@m3UpdateStatus,@m3VoucherNo,@posted_by,@post_priority,@samsung_doc_no,@serp_doctype,@serp_status_id,@year,@period,@transactionType
    print 4
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    print 5
          INSERT INTO [dbo].[post] (doc_id ,samsung_doc_no ,created_date ,process_type,posted_by,post_priority,posting_date,status_id,serp_status_id,line_id,fileid,serp_doctype,doc_type_id,companycode,m3VoucherNo,m3UpdateStatus,division,year,period,transactionType) 
          VALUES(@doc_id,@samsung_doc_no,@now,'C',@posted_by,@post_priority,@now,'L',@serp_status_id,@line_id,@fileid,@serp_doctype,@doc_type_id,@companycode,@m3VoucherNo,@m3UpdateStatus,@division,@year,@period,@transactionType)

          FETCH NEXT FROM db_cursor INTO @companycode,@division,@doc_id,@doc_type_id,@fileid,@line_id,@m3UpdateStatus,@m3VoucherNo,@posted_by,@post_priority,@samsung_doc_no,@serp_doctype,@serp_status_id,@year,@period,@transactionType
    END 
    print 6
    CLOSE db_cursor  
    DEALLOCATE db_cursor

   END

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures type-conversion sql-insert


    【解决方案1】:

    FETCH 中的变量顺序不正确。 [doc_id] 保存在声明为 VARCHAR(100)@companycode 中。您应该检查其他变量顺序,因为没有正确指定。

    FETCH NEXT FROM db_cursor INTO @doc_id,@samsung_doc_no,@posted_by,@post_priority,@serp_status_id,@line_id,@fileid,@serp_doctype,@doc_type_id,@companycode,@m3VoucherNo,@m3UpdateStatus,@division,@year,@period,@transactionType
    

    【讨论】:

    • facepalm 我怎么把这么简单的事情弄错了... :D 非常感谢你的帮助。
    • 很高兴我能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多