2017-02-22 19 views
-1

У меня есть страница asp.net, которая позволяет пользователю выполнять поиск в базе данных, создавая предложение where для включения в хранимую процедуру. Проблема заключается в том, что процедура должна учитывать неизвестное количество параметров для разных условий. Слишком упрощенный пример мог бы выглядеть примерно так:Создание динамического пользовательского запроса без ограничений по параметрам в SQL

SELECT [Column1] FROM [TableName] WHERE 1=1 
--Everything below user generated 
AND 
(
    ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR 
    ([Column2] = '2' AND [Column3] = '6' AND [Column4] = '8') OR 
    ... 
    ([Column2] = '25' AND [Column3] = '3' AND [Column4] = '1') 
) 
AND [Column5] BETWEEN '10' AND '200' 

Мне было интересно, какое лучшее решение для этого было бы. Я знаю, что я могу построить предложение where в виде строки и передать его в хранимую процедуру как один большой параметр и выполнить лот как динамический sql, но что было бы лучшим решением?

+0

Как насчет просмотра LINQ? –

+1

Если это действительно так динамично, было бы проще сделать это просто с динамическим SQL без хранимой процедуры? –

+0

@JamesZ Эта часть запроса является частью гораздо более крупной ранее существующей хранимой процедуры, на которую ссылаются в нескольких других местах. – wheresmyducky

ответ

0

В первую очередь хранимая процедура является оптимизированным/контекстуализированным планом выполнения.

Вы хотите, чтобы у вас не было ограничений для ваших управляемых столбцов, операторов (=, LIKE, <, ...) и количества условий поиска (AND/OR). Это не сводится к плану выполнения.

И даже если у вас есть «легкое» ограничение, вам придется использовать множество параметров с условиями поиска, такими как ([ColumnX] IS NULL OR [ColumnX] = @parameterX) AND .... Это вызовет проблему с производительностью из-за параметра sniffing (more information here). И после оптимизации вы все равно не будете быстрее, чем простой Select, созданный из вашего приложения ASP.

Фактически использование динамического sql было бы лучшим решением, если вы все еще хотите использовать хранимую процедуру. Но вы все равно можете столкнуться с некоторыми результатами производительности, которых у вас не было бы в простом запросе (an example of performance problem).

Ответьте на свой вопрос здесь, забудьте о хранимой процедуре и используйте запрос.