SQLException:string或二进制数据将被截断

我有一个C#代码,在批处理大量的插入语句。 当执行这些语句时,我得到“string或二进制数据将被截断”错误和事务callback。

为了找出哪个插入语句导致了这个问题,我需要在SQLServer中逐一插入,直到遇到错误。

有没有巧妙的方法来找出哪些语句和哪个字段使用exception处理导致此问题? (SQLEXCEPTION)

一般来说,没有办法确定哪个特定语句导致错误。 如果你正在运行几个,你可以看一下profiler,看看最后完成的语句,看看之后的语句是什么,尽pipe我不知道这个方法对你是否可行。

在任何情况下,你的参数variables之一(及其内部的数据)对于试图存储数据的字段来说太大。根据列大小检查参数大小,并且相应的字段应该很快就会明显。

当SQL Server列的数据types的长度小于input表单中input数据的长度时,会发生此类错误。

这种types的错误通常发生在必须比在数据库表中指定的字符或值更多的情况下发生,就像在这种情况下一样:指定transaction_status varchar(10),但实际上试图存储包含19个字符的_transaction_status。 这就是为什么你在这个代码中遇到这种types的错误

BEGIN TRY INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2) END TRY BEGIN CATCH --print or insert into error log or return param or etc... PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'') PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'') END CATCH 

通常情况下,您插入的值大于最大允许值。 例如,数据列最多只能容纳200个字符,但是您要插入201个字符的string

这取决于你如何进行插入呼叫。 所有作为一个电话,或作为一个交易内的个人电话? 如果是个人电话,那么是的(当你迭代通话时,赶上失败的通话)。 如果一个大的电话,然后没有。 SQL正在处理整个语句,所以它不在代码之中。

  1. 获取导致问题的查询(如果没有源,也可以使用SQL Profiler)
  2. 删除所有WHERE子句和其他不重要的部分,直到基本上只剩下SELECT和FROM部分
  3. 添加WHERE 0 = 1(这将只select表结构)
  4. 在FROM子句之前添加INTO [MyTempTable]

你应该得到类似的东西

 SELECT Col1, Col2, ..., [ColN] INTO [MyTempTable] FROM [Tables etc.] WHERE 0 = 1 

这将在您的数据库中创build一个名为MyTempTable的表,您可以将其与目标表结构进行比较,即可以比较两个表上的列以查看它们的不同之处。 这是一个解决方法,但它是我find的最快捷的方法。

使用Linq To SQL我通过logging上下文进行debugging,例如。 Context.Log = Console.Out然后扫描SQL检查是否有明显的错误,有两个:

 -- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1] -- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2] 

最后一个我通过扫描表格模式的值,字段是nvarchar(20),但值是22个字符

-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]

也可能是因为你试图把一个null值放回到数据库中。 所以你的一个交易可能会有空值。

在我们自己的情况下,我增加了sql表允许的字符或字段的大小小于从前端发布的总字符。 因此解决了这个问题。