【问题标题】:System.Data.SqlClient.SqlException: String or binary data would be truncatedSystem.Data.SqlClient.SqlException:字符串或二进制数据将被截断
【发布时间】:2017-01-19 06:33:26
【问题描述】:

我正在创建一个 Web 应用程序,在该应用程序中我正在对我的存储过程执行一个选择命令,但我想将相同的提取数据插入到另一个表中。

所以我尝试做类似以下的事情

CREATE PROCEDURE profinalinstexpensesonid  
    (@from varchar(5000),                
     @to varchar(5000),                
     @trainer varchar(5000),  
     @sonvinid varchar(5000)              
    )            
AS                
BEGIN    
    INSERT INTO invoice(sonvinid, tid, date, brandname, zone, location, area, venuename, venue, instructore, amount)  
        SELECT
            instructoreexpense.sonvinid,  
            sonvininsert.trainer,               
            CONVERT(VARCHAR, sonvininsert.date, 105) AS date,
            sonvininsert.brandname,                
            SUBSTRING(sonvininsert.zone, 1, 1) AS zone,                
            sonvininsert.location,                
            sonvininsert.area,                
            companysonvinunitvenue.venuename,              
            sonvininsert.venue,                
            sonvininsert.instructore,                            
            instructoreexpense.amount  
        FROM
            instructoreexpense                 
        LEFT OUTER JOIN
            sonvininsert ON sonvininsert.sonvinid = instructoreexpense.sonvinid 
                         AND sonvininsert.status = '0'                  
        LEFT OUTER JOIN 
            finalinstructoreexpense ON finalinstructoreexpense.sonvinid = instructoreexpense.sonvinid                  
        LEFT OUTER JOIN
            companysonvinunitvenue ON companysonvinunitvenue.id =  sonvininsert.comsonvinid                           
        WHERE
            sonvininsert.date BETWEEN CONVERT(DATETIME, @from, 105)
                                  AND CONVERT(DATETIME, @to, 105) 
            AND sonvininsert.trainer = (SELECT empname 
                                        FROM trainerdetails 
                                        WHERE trid = @trainer)  
            AND instructoreexpense.sonvinid NOT IN (SELECT CAST(Item AS INTEGER)  
                                                    FROM SplitString(@sonvinid, ','))
        ORDER BY 
            instructoreexpense.sonvinid  
END   

当我执行像

这样的存储过程时
exec profinalinstexpensesonid '01-01-2013','01-01-2017','andrews'

我收到以下错误

消息 8152,级别 16,状态 13,过程 profinalinstexpensesonid,第 10 行
字符串或二进制数据将被截断。

在我的第 10 行,我有以下代码

insert into invoice(sonvinid, tid, date, brandname, zone, location, area, venuename, venue, instructore, amount)

不知道这里出了什么问题?

【问题讨论】:

    标签: sql-server stored-procedures select-insert


    【解决方案1】:

    错误消息指出invoice 表中列的大小小于插入其中的数据的大小。

    例如,如果列brandname 的数据类型为varchar(50),并且您尝试插入多个50 字符,则会导致错误。

    要解决此问题,请将 invoice 中的列大小与插入的列大小进行比较。

    【讨论】:

    • 谢谢先生,如果我想在插入中添加 where 子句以避免重复值怎么办
    • @MumbaiWadala ,你可以在 where 子句中添加必要的条件以避免重复。
    • 什么,我不明白你
    • @MumbaiWadala,你能解决这个问题吗?
    【解决方案2】:

    您需要检查发票表的列大小以及从中填充数据的选择列表中的列。

    假设您要在 table1 中的数据类型为 varchar(50) 的列“A”中插入数据类型为 varchar(70) 的列“B”;这不起作用,因为您试图在 50 varchar 大小的列中插入 70 个字符。

    检查源和目标列数据类型及其长度;并更改它,然后重试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多