Динамический запрос SQL для поиска - PullRequest
3 голосов
/ 07 мая 2010

Я работаю над проблемой, которую, я уверен, кто-то уже видел, но все, что я нашел в сети, это как не сделать это.

Пример поддельной таблицы и динамический поиск . (Из-за моего низкого рейтинга я не могу публиковать изображения. Я знаю, что мне должно быть стыдно !!)

При нажатии кнопки добавления автоматически создается еще одна строка для добавления дополнительных критериев выбора.

(Примечание: мой стол определенно более сложный)

Что касается моей проблемы, я подумал, что знаю, как справиться с SQL для этой задачи, но на самом деле не знаю. Единственные примеры того, что я должен сделать, не предназначены для такого рода динамических запросов к таблицам. В примерах не было возможности создавать столько фильтров поиска, сколько пожелает пользователь (или, возможно, мне не хватало понимания).

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

Мне действительно любопытно, как лучше поступить в этой ситуации. Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 07 мая 2010

У меня был похожий вопрос. Вы можете использовать динамический sql с хранимым процессом sp_executesql , где вы фактически строите свой оператор select как строку и передаете его.

Или вы можете написать хранимый процесс, вроде созданного мной, где у вас есть все условия в предложении where, но значения NULL игнорируются.

Вот сохраненный процесс, который я придумал для моего сценария: Как избежать динамического SQL при использовании неопределенного количества параметров?

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

0 голосов
/ 07 мая 2010

Проверьте SqlBuilder , утилиту для динамического SQL.

0 голосов
/ 07 мая 2010

Исходное сообщение: Напишите sql для поиска с несколькими условиями

select * from thetable
where (@name='' or [name]=@name) and (@age=0 or age=@age)

Однако приведенный выше запрос вызывает сканирование таблицы.Для лучшей производительности и более сложного сценария (я полагаю, вы упростили вопрос в исходном посте), рассмотрите возможность использования динамического SQL.Кстати, Linq to SQL может очень просто помочь вам в создании динамического SQL, например:

IQueryable<Person> persons = db.Persons;
if (!string.IsNullOrEmpty(name)) persons = persons.Where(p=>p.Name==name);
if (age != 0) persons = persons.Where(p=>p.Age=age);
0 голосов
/ 07 мая 2010

Два основных варианта:

Linq to Sql позволяет вам составить запрос, добавить к нему, добавить к нему снова, и он фактически не скомпилирует и не выполнит оператор SQL, пока вы не выполните итерацию результатов.

Или вы можете использовать динамический SQL. Хитрость в том, чтобы упростить это, - это метод «ГДЕ (1 = 1)», но вы должны быть осторожны, чтобы использовать параметры (чтобы избежать атак с использованием SQL-инъекций) и тщательно строить операторы SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...