Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么不是';";字符串或二进制数据将被截断;更具描述性的错误?_Sql Server_Database_Insert - Fatal编程技术网

Sql server 为什么不是';";字符串或二进制数据将被截断;更具描述性的错误?

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

开始:我理解此错误的含义-我没有试图解决它的实例。

众所周知,这个错误很难排除,因为如果在一个100列宽的表中插入100万行,实际上无法确定是哪一行的哪一列导致了错误-您必须修改流程,一次插入一行,然后查看哪一行失败。委婉地说,那是一种痛苦

是否有任何原因使错误看起来不像这样

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>