我有一个C#代码,可以批量处理很多插入语句。在执行这些语句时,我得到“字符串或二进制数据将被截断”错误和事务roledback。
要找出导致这种情况的insert语句,我需要在SQLServer中逐个插入,直到我遇到错误。
是否有巧妙的方法来查找哪个语句和哪个字段使用异常处理导致此问题? (SQLEXCEPTION)
答案 0 :(得分:70)
通常,没有办法确定哪个特定语句导致错误。如果您正在运行多个,您可以观看分析器并查看上一个已完成的语句,看看之后的语句可能是什么,但我不知道这种方法对您是否可行。
无论如何,你的一个参数变量(及其中的数据)对于它试图存储数据的字段来说太大了。根据列大小检查参数大小,有问题的字段应该是明显的很快。
答案 1 :(得分:18)
当SQL Server列的数据类型的长度小于输入到条目表单中的数据的长度时,会发生此类错误。
答案 2 :(得分:7)
这种类型的错误通常发生在您必须将字符或值多于您在Database表中指定的字符或值时,就像在这种情况下那样:指定 transaction_status varchar(10) 但你实际上是想存储 _transaction_status 包含19个字符。这就是你在这段代码中遇到这种错误的原因
答案 3 :(得分:3)
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
答案 4 :(得分:3)
通常,您要插入的值大于允许的最大值。例如,数据列最多只能包含200个字符,但您要插入201个字符的字符串
答案 5 :(得分:2)
这取决于您如何进行插入呼叫。全部作为一个电话,还是作为交易中的个别电话?如果单独调用,则为yes(当您遍历调用时,捕获失败的调用)。如果一个大电话,那么没有。 SQL正在处理整个语句,因此它不受代码的影响。
答案 6 :(得分:2)
你最终会得到像
这样的东西SELECT
Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
[Tables etc.]
WHERE 0 = 1
这将在您的数据库中创建一个名为MyTempTable的表,您可以将其与目标表结构进行比较,即您可以比较两个表上的列以查看它们的不同之处。这是一个解决方法,但它是我发现的最快的方法。
答案 7 :(得分:0)
使用Linq To SQL我通过记录上下文来调试,例如。 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]
答案 8 :(得分:0)
也可能是因为您尝试将null
值重新输入数据库。因此,您的某个交易中可能包含空值。
答案 9 :(得分:0)
在我们自己的情况下,我增加了sql表允许的字符或字段大小,它小于从前端发布的总字符数。因此,解决了这个问题。
答案 10 :(得分:0)
这里的大多数答案都是进行明显的检查,即数据库中定义的列长度不小于您尝试传入的数据的长度。
有几次我被SQL Management Studio咬了一口,做得很快:
sp_help 'mytable'
并且混淆几分钟,直到我发现有问题的列是 nvarchar ,这意味着sp_help报告的长度实际上是支持的实际长度的两倍,因为它是双字节(unicode)数据类型。
即。如果sp_help报告nvarchar长度为40,则最多可存储20个字符
答案 11 :(得分:0)
简单地使用这个: MessageBox.Show(cmd4.CommandText.ToString()); 在c#.net中,这将向您显示主要查询,将其复制并在数据库中运行。