为什么"字符串或二进制数据不会被截断"更具描述性错误?

Sql*_*yan 25 database sql-server insert

首先:我理解这个错误意味着什么 - 我没有尝试解决它的一个实例.

众所周知,这个错误很难排除故障,因为如果你将100万行插入100列宽的表中,几乎无法确定导致错误的行的哪一列 - 你必须修改你的进程以插入一行一次,然后看看哪一个失败了.说得客气一点,这是一种痛苦.

是否有任何理由错误看起来不像这样?

String or Binary data would be truncated
Error inserting value "Some 18 char value" into SomeTable.SomeColumn VARCHAR(10)
Run Code Online (Sandbox Code Playgroud)

如果不是表结构本身,这将使查找和更正值变得容易得多.如果看到表数据是一个安全问题,那么可能是通用的,比如给出尝试值的长度和失败列的名称?

Sql*_*yan 15

事实证明MS Connect上有一个开放的"功能请求" - 如果您希望功能发生变化,我建议您投票支持.

https://connect.microsoft.com/SQLServer/feedback/details/339410/

添加:

实际上看起来还有另外一个要求同样的功能(虽然命名不佳),自从育空2005年的发展以来一直很出色,我鼓励人们也投票支持:

https://connect.microsoft.com/SQLServer/feedback/details/125347/

2016年更新

似乎微软试图删除这个错误的真实年龄的证据.很公平.找到存档旧网站.

  • @YanickRochon我同意 - 我想完成我的MCSM,所以我可以直接问开发团队为什么没有增强它:) (2认同)

pro*_*mba 6

在找不到可接受的答案后,我想出了以下内容:

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

你应该最终得到类似的东西

SELECT
 Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
  [Tables etc.]
WHERE 0 = 1
Run Code Online (Sandbox Code Playgroud)

这将在您的数据库中创建一个名为MyTempTable的表,您可以将其与目标表结构进行比较,以查看它们的不同之处,即您可以比较两个表上的列.

编辑:您可以比较原始表和MyTempTable上每列的数据类型和列大小,以查看它们的不同之处.新表中的所有列名将与旧表相同,数据类型和大小将是相同的例外情况除了违规栏.换句话说,使用此查询,SQL将自动创建足够大的列,以处理源表中可能的最大条目