将连接约束从varchars列表更改为子查询时,转换失败

时间:2016-11-10 19:31:17

标签: sql sql-server sql-server-2012

我尝试通过在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。

1 个答案:

答案 0 :(得分:0)

事实证明,当记录总数超过2080时,执行计划正在发生变化,并且隐式地将varchar字段转换为int。我从SQL Server Profiler中获取了小数据集的XML查询计划,并强制使用较大的数据集查询将其与OPTION (USE PLAN '<Insert XML Query Plan Here />')一起使用。