内部连接上的Sqlserver错误与溢出字段

时间:2018-07-25 10:40:50

标签: sql sql-server tsql

我一直在尝试运行此简单查询,但出现此错误:

enter image description here 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 个答案:

答案 0 :(得分:3)

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

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

我将从以下内容开始:

alter table ingredient alter column recipeId bigint;

如果由于转换错误导致此方法不起作用,那么您需要找到有问题的值。您可以尝试:

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

这应该找到有问题的值。

答案 1 :(得分:3)

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)