【问题标题】:SQL Server Error - Conversion overflowing intSQL Server 错误 - 转换溢出 int
【发布时间】:2020-04-30 20:03:07
【问题描述】:

我在一个简单的 INSERT INTO 语句中收到以下错误

The conversion of the nvarchar value '5551662080' overflowed an int column.

我了解,该值超出了 INT 的范围,但我不会在任何地方转换为 INT。 源表中的字段是目标中的 NVARCHAR(MAX) 我尝试过 FLOAT 和 BIGINT 都失败并出现同样的错误。

背景是我无法控制的源表 - 所有字段都是 NVARCHAR(MAX) 并且该表包含超过 600 万个文件的数据,这些文件起源于 powershell 脚本的输出。我正在将它们移动到具有更合适数据类型的表中。

这是 SQL:

INSERT INTO dbo.File01 (
[Name]
,[Length]
,[Directory]
,[Extension]
,[CreationTime]
,[LastWriteTime]
,[IsFile]
)
SELECT 
    [Name]
    ,cast([Length] as Bigint)
    ,[Directory]
    ,[Extension]
    ,convert(datetime2,[CreationTime], 103)
    ,convert(datetime2,[LastWriteTime], 103)
    ,iif(isnull([Length],1)=1, 0, 1)
FROM dbo.FileData

问题出在文件长度列 - 否则一切正常。它适用于前 91k 行,当它达到这个大数字时就会失败。

我能找到的所有引用都指向在某处隐藏了 INT 转换的触发器或存储过程,但这里的情况并非如此——它是一个全新的数据库,只为完成这项工作而存在

*编辑 目标表的表结构

Column Name Data type   Max Length  precision   scale   is_nullable 
Name        nvarchar    -1     0           0       0         0
Length      bigint       8    19           0       1         0
Directory   nvarchar    -1     0           0       1         0
Extension   nvarchar    -1     0           0       1         0
CreationTime    datetime2   8 27           7       1         0
LastWriteTime   datetime2   8 27           7       1         0
IsFile      bit         1      1           0       1         0

【问题讨论】:

  • 嗨@SurajKumar 恐怕列类型已经是Bigint。任何地方都看不到 Int 类型
  • 能否显示表结构。
  • 表结构添加@YogeshSharma

标签: sql sql-server casting


【解决方案1】:

您需要尝试一下,只需使用单引号,如下所示。

iif(isnull([Length], '1') = '1', '0', '1')

iif(isnull(Cast([Length] as Bigint), 1) = 1, 0, 1)

直播db<>fiddle演示。

【讨论】:

  • 这不能解决问题 - 我需要将第一个表 (5551662080) 中 NVARCHAR 的值转换为第二个表中的等效 Bigint 列
  • 哦,我明白了,导致问题的不是我的演员阵容——而是布尔标志更下方。我会试试的
  • @PerryW 这只是iif() 语句问题及其更正,仅此而已与您现有的逻辑。如果 NVarchar 则使用单引号或将其转换为 `BigInt'。
  • 是的,就是这样——我找错地方了——谢谢
【解决方案2】:

看起来file01 中的length 列是一个整数,而不是一个bigint。因此,将该列转换为 bigint 并没有帮助。

您可以使用try_convert()try_cast() 来解决问题——改成适当的类型:

try_cast([Length] as int)

不过,我建议修复数据类型,因为file01 不能代表您要插入其中的数据:

alter table file01 alter column length bigint;

如果你的表真的很大,这可能需要一段时间,因为所有的数据都需要重写。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 2011-11-02
    • 2014-02-11
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多