use*_*963 2 sql-server datatypes
什么样的数据类型会导致"String or binary data would be truncated"错误?Varchars 和其他字符串很明显,但是“二进制数据”呢?这可以包括整数或日期时间吗?或者这个错误是否只能由必须指定长度的数据类型引起?我找不到任何相关文档,谷歌也让我失望。
我几乎不指望 Microsoft 会反向记录错误消息并尝试详尽地迭代所有可能导致它们的方式。这是您只需要通过测试发现的东西。
也就是说,大多数类型都有首先发生的其他验证,因此永远不会因该特定错误消息而失败。例如,大多数数字类型都有溢出的范围,因此它们会返回溢出错误,有时它们甚至有助于识别导致问题的“第一个”值。一些例子:
DECLARE @x TABLE(a TINYINT);
INSERT @x(a) VALUES(2560); -- 1 char too many
Run Code Online (Sandbox Code Playgroud)
消息 220,级别 16,状态 2,第 3 行
数据类型 tinyint 的算术溢出错误,值 = 2560。
DECLARE @x TABLE(a INT);
INSERT @x(a) VALUES(20000000000); -- 1 char too many
Run Code Online (Sandbox Code Playgroud)
消息 8115,级别 16,状态 2,第 2 行
将表达式转换为数据类型 int 的算术溢出错误。
DECLARE @x TABLE(a DECIMAL(5,2));
INSERT @x(a) VALUES(1000.99); -- 1 char too many
Run Code Online (Sandbox Code Playgroud)
消息 8115,级别 16,状态 8,第 2 行
将数字转换为数据类型数字的算术溢出错误。
Datetime 具有类似的验证,在它关心您实际传递的字符数之前很久就会在转换中失败(即使截断后保留的部分有效):
DECLARE @x TABLE(a DATETIME);
INSERT @x(a) VALUES('2014-05-10 12:34:45612347343483434'); -- many chars too many
Run Code Online (Sandbox Code Playgroud)
消息 241,级别 16,状态 1,第 2 行
从字符串转换日期和/或时间时转换失败。
二进制类型确实返回相同的无用错误消息,例如:
DECLARE @x TABLE(a VARBINARY(2));
INSERT @x(a) VALUES(0x111122223333); -- 4 chars too many
Run Code Online (Sandbox Code Playgroud)
不过,您必须小心,因为有时会发生无声截断。这可以说比收到令人讨厌的错误消息要糟糕得多,因为您实际上已经丢失了数据并且无法恢复。
DECLARE @x VARBINARY(2) = 0x111122223333, @foo VARCHAR = 'bar';
SELECT @x, @foo;
Run Code Online (Sandbox Code Playgroud)
结果:
0x1111 b
Run Code Online (Sandbox Code Playgroud)
请注意,我什至没有声明长度VARCHAR-在某些情况下,默认值为 1 ,在其他情况下为 30。因此,更有理由始终完全匹配数据类型定义并始终明确。
我没有涵盖您感兴趣的类型吗?没问题:您可以尝试一下。
| 归档时间: |
|
| 查看次数: |
3273 次 |
| 最近记录: |