#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. Ты сделал мой день лучше. Точное решение, которое я искал. Приветствую вас. Спасибо