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
相关产品推荐
相关产品推荐

