SQL在插入时如何截断数据?

Posted

技术标签:

【中文标题】SQL在插入时如何截断数据?【英文标题】:How does SQL truncate data when inserting? 【发布时间】:2019-09-24 20:30:44 【问题描述】:

我正在开发一个 SSIS 包,它可以做很多事情,其中​​之一是将数据从一个数据库上的表复制到另一个数据库上的表。在我的一个包组件上,我收到了截断警告,因为源表有ColumnA NCHAR(10),而目标表有ColumnA NCHAR(1)。源表中的 ColumnA 只有 1 个字符长的值,所以理论上,我可以忽略收到的截断警告,因为源数据无论如何只有 1 个字符长。

我可以忽略这些警告是否正确? SQL 究竟如何截断这些实例中的数据?如果源列中只有一个字符包含 10 个字符,那么该字符是否总是被复制到目标,或者是否有可能连那个字符也不会被复制?

【问题讨论】:

如果你 100% 确定它总是“1”,并且如果没有其他人会使用这个“解决方案” - 那么是的,你可以忽略警告 它总是会带入 10 个字符串中的第一个字符。因此,如果您有前导空格,您将在目的地获得一个空格。 请记住,SQL Server 使用 UTF-16 编码,因此 nchar(1) 不能总是包含单个字符。感谢 Unicode 与代理字符的乐趣,以及 Supplementary Multilingual Plane(包含表情符号等)和 Supplementary Ideographic Plane,一些代码点使用多对字节表示。 【参考方案1】:

SSIS 总是修剪最后一个字符。因此,如果您正在处理像“123456789”这样的 9 个字符的字符串并将其插入到具有 5 个字符的列的列中,SSIS 会修剪最后 4 个字符,将字符串转换为“12345”。如果您要插入长度为 1 个字符的列,SSIS 将缩减为“1”。

如果您确信您永远不会从可能包含十个字符的来源收到长度超过 1 个字符的字符串,请随时忽略该警告。这当然是理论上的。在实践中,您最好为您的 OLE DB 源编写 SELECT 语句或类似语句,例如:

CASE WHEN LEN(ColumnA) <> 1
THEN 'e' --e for error; destination column length is 1
ELSE ColumnA
END AS ColumnA

处理这样的错误。

如果您有 API 源或其他非 OLE DB 源,您可以使用 SSIS 的派生列来获得类似的效果。

【讨论】:

以不同方式插入和检索句柄截断。插入应该引发错误。 我不明白您所说的“检索”是什么意思。如果需要,您可以将 THEN 'e' 的长度扩展到长度为 5 的字符串 'error'。加载到 1 列会终止 SSIS 任务,这可能是取决于 E. Kelly 的设计要求的潜在解决方案 插入数据与选择数据。

以上是关于SQL在插入时如何截断数据?的主要内容,如果未能解决你的问题,请参考以下文章

sql怎么插入日期类型数据报将截断字符串或二进制数据

我的 Sql Bulk 插入加载数据并截断

帮助 SQL Server 触发器在插入前截断错误数据

用户将在 SQL Server 中截断字符串或​​二进制数据

把表A 数据插入表B时提示 ‘将截断字符串或二进制数据。 语句已终止’ 。如何找到被截断数据或字段。

sqlserver插入语句报“将截断字符串或二进制数据”怎么解决,怎么回事?