带溢出字段的内部联接出现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)