Sql server 为什么不是';";字符串或二进制数据将被截断;更具描述性的错误?
开始:我理解此错误的含义-我没有试图解决它的实例。 众所周知,这个错误很难排除,因为如果在一个100列宽的表中插入100万行,实际上无法确定是哪一行的哪一列导致了错误-您必须修改流程,一次插入一行,然后查看哪一行失败。委婉地说,那是一种痛苦 是否有任何原因使错误看起来不像这样Sql server 为什么不是';";字符串或二进制数据将被截断;更具描述性的错误?,sql-server,database,insert,Sql Server,Database,Insert,开始:我理解此错误的含义-我没有试图解决它的实例。 众所周知,这个错误很难排除,因为如果在一个100列宽的表中插入100万行,实际上无法确定是哪一行的哪一列导致了错误-您必须修改流程,一次插入一行,然后查看哪一行失败。委婉地说,那是一种痛苦 是否有任何原因使错误看起来不像这样 String or Binary data would be truncated Error inserting value "Some 18 char value" into SomeTable.SomeColumn V
String or Binary data would be truncated
Error inserting value "Some 18 char value" into SomeTable.SomeColumn VARCHAR(10)
这将使查找和更正值(如果不是表结构本身)更加容易。如果查看表数据是一个安全问题,那么可能是一些通用的问题,比如给出尝试值的长度和失败列的名称?Microsoft是懒惰的吗
顺便说一下,您不必分别尝试每行插入。只需为每个文本列查询max(len(field)),从您怀疑可能是罪魁祸首的列开始。简短回答:
事情就是这样
详细回答:
我可以看到显示行号和列的价值,但显示被截断的实际信息可能没有意义。对于VARCHAR(10)场景,这可能不是什么大问题,但是过大的数据将非常有用。但希望这里没有人插入比VARCHAR(MAX)所能容纳的更多的内容;) 软件系统中的描述性错误消息与不存在的错误消息一样好 这不仅适用于DBMS,而且适用于任何一种可以想象的软件 我认为根本原因是“良好的描述性错误消息”需要太多时间来实现。一般软件开发人员的文化中不会花太多时间考虑“如果出现这种特殊的异常情况,用户希望看到哪些信息”?那些不得不写下代码来给出“好的描述性错误消息”的程序员只看到了成本(他们的时间),而没有看到好处
我从软件系统中收到的最新错误消息之一是“发生了错误,请稍后再试。”。不是开玩笑。事实证明,在MS Connect上有一个开放的“功能请求”——如果您希望更改功能,我鼓励您投票支持它 添加: 事实上,我还鼓励人们投票支持另一项自2005年育空地区开发以来一直非常出色的相同功能(尽管名称很差): 2016年更新
微软似乎已经试图删除该漏洞真实年龄的证据。很公平。查找回答已关闭的DUP的,因此在此处回答。这个模式可以使用,如果有点复杂的话,但是当更改应用程序或者设置探查器以查看发生了什么事情时,它非常有用。有时,您只需要将错误传播到应用程序本身,这样您就可以从应用程序中看到正确且有用的错误消息 在这些情况下,使用此解决方案快速插入数据库将节省大量时间。将其另存为模板,并对其进行快速更改以解决任何表上的此问题 问题 样本表
create table StringTruncation
(A int, B varchar(10), C nvarchar(5), D nvarchar(max), E datetime)
示例语句
insert StringTruncation values
(1, '0123456789', 'abcdef', 'This overflows on C', GETDATE())
可怕的无用错误
Msg 8152, Level 16, State 4, Line 1
String or binary data would be truncated.
The statement has been terminated.
该示例仅显示了可能溢出的2列,但想象一下,如果是20列或40列
解决方案
测试一下
结果
Msg 50000,16级,状态1,程序触发ioi字符串截断,第18行列[D]大小为10的数据太长:0s123456789
(1行受影响) 笔记
- 它需要一个镜像触发器进行更新
- 它目前只报告第一个违规记录列。报告不止一个记录栏是可能的,但我认为这实际上适得其反
- 获取导致问题的查询(如果没有源代码,也可以使用SQL Profiler)
- 删除所有WHERE子句和其他不重要的部分,直到基本上只剩下SELECT和FROM部分
- 添加0=1(这将仅选择表结构)
- 在FROM子句之前添加到[MyEntable] 你应该以这样的方式结束
- 在任何地方都找不到可接受的答案后,我想到了以下几点:
SELECT
Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
[Tables etc.]
WHERE 0 = 1
这将在数据库中创建一个名为MyTestable的表,您可以将该表与目标表结构进行比较,以查看它们的不同之处,即您可以比较两个表上的列
编辑:您可以比较原始表和MyTest中每列的数据类型和列大小,查看它们的不同之处。新表中的所有列名将与旧表中的列名相同,并且数据类型和列大小将相同,但有问题的列除外。换句话说,通过此查询,SQL将自动创建足够大的列,以处理源表中最大的可能条目我也有此错误,但我发现了原因:
<option>description</option> <-- this is not error but is wrong
<option value="option1">option1</option>
<option value="option2">option2</option>
<option value="option3">option3</option>
description我不确定SQL Server团队以外的任何人都能回答这个问题。可能有各种原因。最终,这个问题只能由微软来回答,我认为如果他们还没有解决,很可能不容易解决。您可以提交增强请求;也许它会在SS2012中得到解决。@Remus Rusanu:Bat signal 4 U向Microsoft Connect提出改进请求!我会投票赞成你的要求!我同意marc的观点:打开一个连接请求,或者对现有的请求进行投票,或者这是一个聪明的方法,可以在一个大的值列表中找出有问题的列。干得好!我不明白,这有助于找到有问题的列吗?@h-abraham-chavez这将创建一个新表,您可以在b列上进行比较
SELECT
Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
[Tables etc.]
WHERE 0 = 1
<option>description</option> <-- this is not error but is wrong
<option value="option1">option1</option>
<option value="option2">option2</option>
<option value="option3">option3</option>