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

带溢出字段的内部联接出现Sqlserver错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,我一直在尝试运行此简单查询,但出现以下错误: 选择I.RecipeId, 一、姓名 就像我一样 内连接 菜谱 在…上 I.RecipeId=CAST(R.id为nvarchar(最大)) 哪里 I.RecipeId>=241956 及 I.RecipeId您的数据模型中存在一个基本问题。在recipe表中,id是bigint。在成分列中,类型为varchar(30) 修正数据模型!引用类型应该是相同的类型。这是使用关系数据库时的一个非常重要的原则。表示关系的列需要兼容 首先,我想说: alt

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

选择I.RecipeId,
一、姓名
就像我一样
内连接
菜谱
在…上
I.RecipeId=CAST(R.id为nvarchar(最大))
哪里
I.RecipeId>=241956
及

I.RecipeId您的数据模型中存在一个基本问题。在
recipe
表中,
id
bigint
。在
成分
列中,类型为
varchar(30)

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

首先,我想说:

alter table ingredient alter column recipeId bigint;
如果由于转换错误而无法工作,则需要找到有问题的值。您可以尝试:

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

这应该会找到有问题的值。

RecipeID是一个文本值,它与硬编码整数
241956
进行比较。这迫使电机将存储在
RecipeID
中的所有值转换为整数值。因为至少有一个值(
1600889691736173116
)超过了整数的最大值,所以它会失败

您可以显式地将硬编码值转换为可容纳更高值的
BIGINT
,包括
1600889691736173116
。试试这个:

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)

埃兹洛,你的询问毫无意义。您可以使用
I.RecipeId=CAST(R.id为nvarchar(MAX))
。但是
I.RecipeId
是INT,而
R.id
是BIGINT,那么为什么要将
R.id
更改为nvarchar以便与INT进行比较?!?在转换之后,将字符串与数字进行比较。您应该将两者转换为相同的类型-在本例中,转换为更大的类型,即BIGINT@Ronen,EzLo answer支持问题所在-RecipeId列存储为varchar,允许它存储1600889691736173116。解决这个问题。该列需要转换为bigint,以允许与配方表Id(即bigint)进行比较。请参考@MEdwin:EzLo在我写评论后编辑了他的答案!这是我讨厌stackoverflow接口的主要原因之一。这种类型的行为使评论变得无关紧要,并导致像您这样的回应!检查答案编辑的历史记录,您将看到EzLo首先尝试将值转换为字符串,并将字符串与整数进行比较!这是从他的答案中抄袭过来的:
I.RecipeId=CAST(R.id为nvarchar(MAX))
可悲的是,你的评论得到了投票,而我的修改答案的线索变得无关紧要,似乎我写错了什么。。。我之所以喜欢使用MSDN论坛(我在这里担任版主)而不是stackoverflow,有一些原因,这就是其中一个原因:-(@Ronenariley是的,你是对的,似乎我在你的评论后编辑了答案,可能是投票人误解了你的信息。很抱歉,我没有在编辑中留下评论,因为我习惯在编辑后删除这些类型的评论。
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)