首页 > 解决方案 > IN() 中子查询的 csv 导致转换错误

问题描述

CROSS APPLY (
    SELECT
        ISNULL(
            (
                SELECT
                    SUM (R.CALORIE)
                FROM
                    TA_RECIPE AS R
                WHERE
                        R.NO_RECIPE IN ([mp].recipe_ids)
                        OR R.NO_RECIPE IN ([tags2].recipe_ids)

            ),
            0
        ) AS caloriePerPortion
) AS [CAL]

问题出在部分

R.NO_RECIPE IN ([mp].recipe_ids)
OR R.NO_RECIPE IN ([tags2].recipe_ids)

当 recipe_ids 中只有一个 id 时,recipe_ids 包含逗号分隔的列表,它可以正常工作,但如果 recipe_ids 中实际上有一个列表,则 sql 服务器会将其解释为 varchar 而不是整数列表

将它们包装在 STRING_SPLIT 中会导致查询变得非常慢(增加了几秒钟的执行时间)

标签: sql-server

解决方案


将它们包装在 STRING_SPLIT 中会导致查询变得非常慢

但这是唯一可行的方法。

select *
from t 
where c in ('1,2,3,4,5')

只是不做你想做的事。


推荐阅读