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 Server 中截断字符串或二进制数据