我尝试通过在IN
语句(处于连接条件)中切换静态varchars列表来更新我们运行的过程,以使用子查询。但是,我收到错误Conversion failed when converting the varchar value 'Normal' to data type int.
我知道这意味着在查询的某个地方,我试图转换价值'正常'到一个int,但是在这个查询中,不存在任何东西应该是int的地方 - 它的所有varchar或datetime,并且子查询返回与前一个静态varchars列表相同的值。此外,我的数据集中的任何位置都没有值" Normal",这真让我感到困惑。
有没有其他人之前处理过这样的事情?
修改
这是代码(简化为只显示导致错误的部分):
select * from #tempTable
left join dbo.v_Lookup_Assumptions Assumptions on
case when Group3 in
--('Value1', 'Value2', 'Value3')
(Select lookupdetail_name from lookupDetail)
then Group3 else Group2 end =Assumptions.Sector2
and AsOfDate between Assumptions.StartDate and Assumptions.EndDate
and ShortName = Assumptions.AssumptionShortName
我可以注释掉子查询并取消注释值列表并且它可以工作。另外,如果我没有运行" ShortName"当我使用子查询时,它会起作用(虽然没有像你期望的那样给出预期的结果)。所有连接约束都是varchar或date。
此外,我添加了'普通'到静态值列表,它按预期运行。我还将子查询更新为SELECT 'Value1' from lookupDetail
,但失败了。
EDIT2:
这没有任何意义,但是如果我将原始#tempTable
限制为2080条记录,则新的子查询语法可以正常工作。但是,如果我让它转到2081个记录则失败 - 无论数据集如何。换句话说,当我更改日期时,我每次都会获得不同的数据,并将#tempTable
限制为2080条记录,这种新语法运行得很好。将其更改为2081条记录,但失败。如果我运行2081记录数据集并使用WHERE子句进行过滤,我可以显示2081记录中的每一行,只要它不是同时的所有2081。
答案 0 :(得分:0)
事实证明,当记录总数超过2080时,执行计划正在发生变化,并且隐式地将varchar字段转换为int。我从SQL Server Profiler中获取了小数据集的XML查询计划,并强制使用较大的数据集查询将其与OPTION (USE PLAN '<Insert XML Query Plan Here />')
一起使用。