Я здесь, чтобы поделиться консолидированным анализом следующего сценария:
У меня есть таблица «Предмет», и у меня есть поисковая СП для нее. Я хочу иметь возможность искать несколько кодов предметов, например:
- Table structure : Item(Id INT, ItemCode nvarchar(20))
- Filter query format: SELECT * FROM Item WHERE ItemCode IN ('xx','yy','zz')
Я хочу сделать это динамически, используя хранимую процедуру. Я передам параметр @ItemCodes, значения которого будут разделены запятыми (','), и поиск будет выполнен, как указано выше.
Ну, я уже посетил много сообщений \ форумов, и вот несколько тем:
- Динамический SQL может быть наименее сложным способом, но я не хочу рассматривать его из-за таких параметров, как производительность, безопасность (SQL-инъекция и т. Д.).
Также другие подходы, такие как XML и т. Д., Если они усложняют ситуацию, я не могу их использовать.
И, наконец, пожалуйста, никаких дополнительных трюков JOIN для повышения производительности. Я должен управлять не только сложностью, но и производительностью.
Хранимая процедура T-SQL, которая принимает несколько значений идентификаторов
Передача списка входящих через хранимую процедуру Я просмотрел два вышеупомянутых сообщений и рассмотрены некоторые предоставленные решения, вот некоторые ограничения:
http://www.sommarskog.se/arrays-in-sql-2005.html Это потребует от меня «объявить» тип параметра при передаче его в SP, это искажает абстракцию (я не устанавливаю тип ни в одном из моих параметров, потому что каждый из к ним относятся в общем случае)
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters. Это структурированный подход, но он увеличивает сложность, требует изменения уровня структуры БД и не является абстрактным, как указано выше.
http://madprops.org/blog/splitting-text-into-words-in-sql-revisited/ Что ж, похоже, это соответствует моим старым решениям. Вот что я делал в прошлом -
I created an SQL function : [GetTableFromValues] (returns a temp table populated each item (one per row) from the comma separated @ItemCodes)
И вот как я использую его в моем фильтре WHERE caluse в SP -
SELECT * FROM Item WHERE ItemCode in (SELECT * FROM[dbo].[GetTableFromValues](@ItemCodes))
Этот многоразовый, выглядит простым и коротким (конечно, сравнительно). Все, что я пропустил, или любой эксперт с лучшим решением (очевидно, «в рамках» ограничений, указанных выше).
Спасибо.