You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL报表函数仅取子查询首个值,如何匹配全部符合条件数据?

问题解决方法

核心问题分析

你的函数出现该问题有两个关键原因:

  1. 参数类型未指定长度:@ID_Model_list和@ID_Station_list定义为varchar但未指定长度,SQL Server会默认仅保留1个字符,导致传入的逗号分隔字符串被截断;即便未截断,用=匹配多行子查询的写法也只会取子查询的第一个结果(这种写法本身不符合语法规范,正常场景下会直接报错)。
  2. WHERE条件匹配逻辑错误:用=来匹配子查询返回的多个值,只能匹配到子查询的第一个结果,无法覆盖所有符合条件的取值。

具体修改步骤

1. 修正参数数据类型

将函数的两个字符串参数改为varchar(MAX)(或根据实际业务需求指定足够大的长度),避免传入的长字符串被截断:

CREATE FUNCTION V_Scrap_Report
 (@ID_Model_list varchar(MAX), @ID_Station_list varchar(MAX), @fecha datetime, @fechafin datetime)
 RETURNS TABLE
 AS RETURN

2. 修改WHERE条件的匹配方式

将=替换为IN,同时给S.IDEstacion的匹配值加上类型转换(string_split返回的是字符串类型,而S.IDEstacion应为整数类型,避免隐式转换问题):

WHERE S.fecha >= @fecha 
AND   S.fecha <= DATEADD(HOUR,23.9999,@fechafin)
AND   S.IDModelo IN (SELECT CAST(VALUE AS INT) FROM string_split(@ID_Model_list,','))
AND   S.IDEstacion IN (SELECT CAST(VALUE AS INT) FROM string_split(@ID_Station_list,','))

完整修改后的函数代码

CREATE FUNCTION V_Scrap_Report
 (@ID_Model_list varchar(MAX), @ID_Station_list varchar(MAX), @fecha datetime, @fechafin datetime)
 RETURNS TABLE
 AS RETURN
(SELECT   S.IDScrap
        , S.fecha
        , M.modelo
        , E.estacion 
        , C.correccion
        , S.elemento
        , P.nombre
        , P.numeroparte
        , Sp.cantidad
FROM            dbo.Scrap           S 
FULL OUTER JOIN dbo.Modelo          M   ON  S.IDModelo      =   M.IDModelo
FULL OUTER JOIN dbo.Estacion        E   ON  E.IDEstacion    =   S.IDEstacion
FULL OUTER JOIN dbo.Scrapcorreccion Sc  ON  S.IDScrap       =   Sc.IDScrap
FULL OUTER JOIN dbo.Correccion      C   ON  C.IDCorrecion   =   Sc.IDCorrecion 
FULL OUTER JOIN dbo.Scraparte       Sp  ON  S.IDScrap       =   Sp.IDScrap
JOIN        dbo.Parte           P   ON  Sp.IDParte      =   P.IDParte 
WHERE S.fecha   >= @fecha 
AND   S.fecha   <= DATEADD(HOUR,23.9999,@fechafin)
AND   S.IDModelo IN (SELECT CAST(VALUE AS INT) FROM string_split(@ID_Model_list,','))
AND   S.IDEstacion IN (SELECT CAST(VALUE AS INT) FROM string_split(@ID_Station_list,',')))

修改完成后,函数即可匹配所有S.IDModelo在传入模型ID列表、且S.IDEstacion在传入工位ID列表中的数据。

内容的提问来源于stack exchange,提问作者Robinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:57:20