识别将在插入查询中截断的值

时间:2011-02-28 14:45:12

标签: sql-server sql-server-2005 tsql

我试图将一些数据插入表中,然后收到错误消息

Msg 8152, Level 16, State 14, Line 1
String or binary data would be truncated.

现在我知道这是因为试图插入对于列来说太大的数据(在这种情况下是VARCHAR(50)),但它让我想到是否可能:

a)看看哪些特定值会被截断(请记住,这可能会发生在多列中),也许是通过给出将被截断的所有行的输出?

b)如果在批量插入中,有任何方法可以查看每个列将被截断的最大输入数据值(因此我可以看到数据存储类型是否实际需要更改,或者是否只有一个或两个不适合列的情况?)

4 个答案:

答案 0 :(得分:12)

没有特别令人满意的方法来查找有问题的行。

This blog post has one solution.SET ANSI_WARNINGS OFF并插入临时表,然后对源使用EXCEPT查找未成功导入的行)

答案 1 :(得分:3)

您可以按如下方式获取表格中列的最大长度

SELECT CHARACTER_MAXIMUM_LENGTH
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='MyTableName'

INFORMATION_SCHEMA.COLUMNS是一个内置系统View。这应该有助于你上面的第二个问题。

答案 2 :(得分:1)

我找到的最佳解决方案是仅将结构选择到新表中(SELECT INTO FROM WHERE 1 = 0)并比较列类型和长度。Full answer here.

答案 3 :(得分:0)

如果您使用相当简单的类型,可以尝试

select datalength(mycolumn) from mytable where myid = 1