Сохраненный процесс с 11+ динамическими параметрами - PullRequest
0 голосов
/ 19 января 2011

Я знаю, что этот вопрос задавался и обсуждался ранее. Ответы, которые я прочитал, являются главным образом мнением, поэтому я ищу что-то более техническое. Еще "под капотом".

Я использую SQL Server 2008. Я собираюсь написать запрос, который должен будет принять как минимум 11 входных данных. Пользователь может указать от 1 до 11 (+) из них. Они бывают разных типов (идентификаторы, сопоставление текста, география, полнотекстовое сопоставление, наборы записей и т. Д.). Это так же динамично, как вы можете получить с помощью SQL.

Я знаю, как это сделать без использования динамического SQL:

/*for simple match*/ WHERE @Input IS NOT NULL OR t.col = @Input

Это имеет недостатки из-за объединений и т. Д. Я никогда не использую динамический SQL. Но из того, что я прочитал, кажется, что это может быть дело с динамическим SQL.

Кто-нибудь может дать несколько технических указаний, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 19 января 2011

http://www.sommarskog.se/index.html

Посмотрите на проклятие и благословение Dynamic SQl и ссылки Условия динамического поиска

1 голос
/ 19 января 2011

Вы должны помнить, что если вы не хотите использовать динамический SQL (и я бы тоже не стал), то принцип СУХОГО является как бы за окном.

Эффективно используйте TVP ипримите тот факт, что у вас будет несколько высокая цикломатическая сложность (для оператора SQL)

Если вы хотите, чтобы все было кэшироваться и обрабатываться, вы должны подумать о том, как спроектировать его в нескольких процедурах, а затем нарушать ваши условия при необходимости.

Другой очень распространенный подход состоит в том, чтобы включать такие условия, как:

WHERE (@pParam IS NULL OR ~condition~)

Если ваш параметр равен NULL, тогда SQL не потрудится разрешить вторую половину условия.РЕДАКТИРОВАТЬ: Эта последняя часть применяется только в SQL2008R2 и только при использовании OPTION(RECOMPILE) команда

...