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

FOR XML PATH拼接ID仅返回首项导致筛选结果异常问题求助

核心问题

你现有代码的逻辑完全倒置,同时存在匹配边界缺失、性能低下的问题:

  • 将单条预订关联的所有RoomUseId拼接为字符串,判断入参@roomTypeList是否包含该拼接串,只有预订所有RoomUseId都按顺序出现在入参中才会命中,不符合「只要任意一个RoomUseId在列表中即可」的需求
  • 未加匹配边界,会出现RoomUseId=13被误判为匹配到3的问题
  • 每条预订都要执行子查询拼接全量夜次的RoomUseId,数据量稍大就会出现严重性能问题
修复方案

方案1:SQL Server 2016及以上版本(推荐)

直接用内置函数STRING_SPLIT拆分入参列表,配合EXISTS判断,性能最优:

SELECT r.Id, r.BookingStatus, r.CurrencyId
FROM Reservations r
WHERE 
  @roomTypeList IS NULL 
  OR EXISTS (
    SELECT 1 
    FROM ReservationNights rn
    INNER JOIN STRING_SPLIT(@roomTypeList, ';') s 
      ON CAST(rn.RoomUseId AS NVARCHAR(10)) = s.value
    WHERE rn.ReservationId = r.Id 
      AND rn.RoomUseId IS NOT NULL
      AND s.value != '' -- 过滤入参末尾分号带来的空值
  )

方案2:低版本SQL Server兼容方案

无需拆分字符串,通过加分号做匹配边界避免误判,逻辑简单易维护:

SELECT DISTINCT r.Id, r.BookingStatus, r.CurrencyId
FROM Reservations r
INNER JOIN ReservationNights rn ON rn.ReservationId = r.Id
WHERE 
  @roomTypeList IS NULL 
  OR (
    rn.RoomUseId IS NOT NULL
    AND ';' + @roomTypeList + ';' LIKE '%;' + CAST(rn.RoomUseId AS NVARCHAR(10)) + ';%'
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:03