代码之家  ›  专栏  ›  技术社区  ›  hello B

带溢出字段的内部联接出现SQLServer错误

  •  -1
  • hello B  · 技术社区  · 8 年前

    我一直试图运行这个简单的查询,但出现了以下错误:

    选择i.recipeid,
    一、名称
    从配料中提取
    内连接
    配方为R
    在
    i.recipeid=铸件(R.ID为nvarchar(max))。
    哪里
    I.Recipeid>=241956
    和
    I.接收<=242018
    < /代码> 
    
    < Buff行情>
    

    varchar值“160088961736173116”的转换溢出了int列。

    < /块引用 enter image description here

    Select  I.RecipeId,
       I.Name 
        from  Ingredient as I 
         inner  join 
          Recipe  as R
           on  
           I.RecipeId   = CAST( R.id AS nvarchar(MAX)) 
             where 
              I.RecipeId >= 241956 
              AND 
              I.RecipeId <= 242018
    

    varchar值“160088961736173116”的转换溢出了int列。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Gordon Linoff    8 年前

    您的数据模型中有一个基本问题。在 recipe id bigint . 在 ingredient 列,类型为 varchar(30) .

    修复数据模型!引用类型应为同一类型。这是使用关系数据库时非常重要的原则。表示关系的列需要兼容。

    我将从以下内容开始:

    alter table ingredient alter column recipeId bigint;
    

    如果由于转换错误而无法正常工作,则需要找到有问题的值。你可以试试:

    select *
    from ingredient
    where recipeId like '%[^0-9]%';
    

    这应该会发现有问题的价值观。

        2
  •  3
  •   EzLo tumao kaixin    8 年前

    recipeid是一个正在与硬编码整数进行比较的文本值。 241956 . 这迫使电机转换存储在 RecipeID 为整数值。因为至少有一个值( 160088961736173116 )如果超过整数的最大值,则失败。

    可以将硬编码值显式转换为 BIGINT 它可以保存更高的值,包括 160088961736173116 . 试试看:

    Select  
        I.RecipeId,
        I.Name 
    from  
        Ingredient as I 
        inner  join Recipe as R on CONVERT(BIGINT, I.RecipeId) = R.id
    where 
        I.RecipeId  BETWEEN CONVERT(BIGINT, 241956) AND CONVERT(BIGINT, 242018)