Я здесь, чтобы поделиться консолидированным анализом по следующему сценарию:
У меня есть таблица «Item», и у меня есть SP для поиска. Я хочу иметь возможность поиска нескольких ItemCodes вроде:
- Table structure : Item(Id INT, ItemCode nvarchar(20))
- Filter query format: SELECT * FROM Item WHERE ItemCode IN ('xx','yy','zz')
Я хочу сделать это динамически, используя хранимую процедуру. Я передам параметр @ItemCodes, который будет иметь значения, разделенные запятыми (','), и поиск будет выполняться, как указано выше.
Ну, я уже побывал во многих постах \ форумах, и вот некоторые темы:
- Динамический SQL может быть наименее сложным способом, но я не хочу его рассматривать из-за таких параметров, как производительность, безопасность (SQL-инъекция и т. Д.) ..
Также другие подходы, такие как XML и т. Д., Если они усложняют ситуацию, я не могу их использовать.
И, наконец, никаких дополнительных временных таблиц.
Я должен управлять производительностью, а также сложностью.
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))
Этот многоразовый и выглядит простым и коротким (сравнительно, конечно). Все, что я пропустил, или любой эксперт с лучшим решением (очевидно, «в пределах» ограничений вышеупомянутых пунктов).
Спасибо.