Как я могу использовать оператор LIKE вместо оператора IN для нескольких запятых, содержащих строку в хранимой процедуре

#sql-server #linq #tsql #stored-procedures #linq-to-sql

Вопрос:

Я только что создал хранимую процедуру для элементов поиска перед процедурой, которую я делал все это с помощью LINQ в C#, например

 //orders  if (objParam.OrderNumber != null amp;amp; objParam.OrderNumber.Count gt; 0)  {  foreach (var orderNumber in objParam.OrderNumber)  {  orderNumbersBuilder.Append(','   orderNumber.ToString());  }  }   var orderNbrs = orderNumbersBuilder.ToString().Trim(',').Split(',');   //Searching  (objParam.OrderNumber.Count == 0 || orderNbrs.Any(a =gt; i.tblOrderMaster.OrderNumber.Contains(a)))  

Теперь я хочу заняться хранимой процедурой. Я получаю результат с помощью оператора IN, но я хочу использовать, например, оператор LIKE

 SELECT * FROM tblOrderMaster WHERE TrxNumber LIKE '%'   (SELECT * FROM STRING_SPLIT('1330,1329',','))   '%'  

У меня есть несколько фильтров, поэтому я не хочу использовать функции и подзапросы, например

 --Params  @Account NVARCHAR(MAX) = NULL,  @OrderNumber NVARCHAR(MAX) = NULL,  @Carrier NVARCHAR(MAX) = NULL,  @ItemCode NVARCHAR(MAX) = NULL,  @OrderType NVARCHAR(MAX) = NULL,  @PONumber NVARCHAR(MAX) = NULL,  @SONumber NVARCHAR(MAX) = NULL --columns start --columns end  --Where condtions  (@ACCOUNT IS NULL OR @Account = '' OR partners.PartnerCode IN (select * from string_split(@ACCOUNT,','))) -- multi select filters started  AND  (@OrderNumber IS NULL OR @OrderNumber = '' OR orderMaster.OrderNumber IN (select * from string_split(@OrderNumber,',')))  AND  (@Carrier IS NULL OR @Carrier = '' OR carrier.Description IN (select * from string_split(@Carrier,',')))  AND  (@ItemCode IS NULL OR @ItemCode = '' OR itemMaster.ItemCode IN (select * from string_split(@ItemCode,',')))  AND  (@OrderType IS NULL OR @OrderType = '' OR orderMaster.OrderType IN (select * from string_split(@OrderType,',')))  AND  (@PONumber IS NULL OR @PONumber = '' OR orderMaster.PONumber IN (select * from string_split(@PONumber,',')))  AND  (@SONumber IS NULL OR @SONumber = '' OR orderMaster.SONumber IN (select * from string_split(@SONumber,',')))      

Комментарии:

1. Я настоятельно рекомендую вам переключиться на Параметры с табличным значением

Ответ №1:

Вам нужно будет использовать подзапросы; тот факт, что вы этого не хотите, не меняет этого в вашем текущем дизайне. Используя запрос с имеющимися у вас литеральными значениями, это будет выглядеть следующим образом:

 SELECT * FROM dbo.tblOrderMaster OM WHERE EXISTS (SELECT 1  FROM STRING_SPLIT('1330,1329', ',') SS  WHERE OM.TrxNumber LIKE '%'   SS.[Value]   '%')  

Если вы действительно не хотите использовать подзапросы, то используйте параметры типа таблицы, а затем вы можете выполнить JOIN :

 SELECT OM.* FROM dbo.tblOrderMaster OM  JOIN @YourTableVariable YTV ON OM.TrxNumber LIKE '%'   YTV.SearchValue   '%'  

Комментарии:

1. Ты сделал мой день лучше. Точное решение, которое я искал. Приветствую вас. Спасибо