![]() |
|
Модераторы: Akina |
![]()
|
|
| Juju |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
В журнале MAXIM, есть рубрика: "Задай глупый вопрос и получи умный ответ", я долго пытался найти выход сам, т.к. знаю, что проблема не сложная, но сдался и решил попросить помощи у Вас!
Я не знаток MS SQL вообще, а только вынужден работать с неработающим чужим приложением... К делу: Есть две громадные таблицы с большим кол-вом полей... я уменьшу их в примере для читаемости и понимания. Есть форма запроса, где в edit-ах (которые относятся к полям таблицы) пользователь может набирать параметры запроса (Учавствуют для соединения с сервером TADOConnection, TADODataSet и в принципе все работает) На Delphi написана следующая процедура (возьмем к примеру 5 полей, названия тоже упрощены для наглядности):
На MS SQL Server 2000 написана процедура:
Если все поля поиска заданы - поиск работает, а если передается параметр NULL (что конечно же будет) результаты поиска приводят к неверным результатам (попросту не находят заданные значения) Подскажите как правильно написать SELECT, чтобы в запросе присутствовали только те поля (параметры) которые заданы пользователем, а упущенные (параметр NULL) игнорировались (упускались) в запросе... На MS ACCESS я просто формировал строку запроса в Delphi в зависимости от заполнения пользователем поисковых полей и отсылал ее в Query... А здесь хотелось бы обойтись минимальной логикой в программе... Это сообщение отредактировал(а) Juju - 13.5.2008, 18:14 |
||||
|
|||||
| Magnifico |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
проверять на null каждый параметр и формировать разные запросы по условию
Это сообщение отредактировал(а) Magnifico - 13.5.2008, 20:11 -------------------- Всё в порядке - спасибо зарядке ! |
||||
|
|||||
| Juju |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Magnifico, спасибо за ответ... т.е. предлагается:
Если параметр @DateBirth = null - строим запрос без поля FIELD5
Если параметр @Phone = null - строим запрос без поля FIELD4
Если параметр @Phone=null и @Age=null - строим запрос без поля FIELD4, FIELD3
И так перебираем все комбинации? Даже если поисковых параметров до 20-ти?????? |
||||||
|
|||||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Что мешает построить запрос в текстовом виде и выполнить его через exec()?
|
|||
|
||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Itsys это типа таким образом...???
В Delphi:
Но есть ли возможность сделать все тонко на стороне сервера? |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Ну примерно так:
|
|||
|
||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Оу, спасибо! А как мне теперь это чудо в Delphi показать?
|
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
C Delphi не знаком...
|
|||
|
||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Itsys, все равно спасибо... буду пробовать "прикрутить" это к своему коду...
|
|||
|
||||
| Juju |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Делаю по образу и подобию... как показал тов.Itsys, но прикрутить к своему коду так и не удается...
Процедура на Delphi: (передаю один параметр т.к. нет смысла загружать код кучей, если не работает с единственным. Чтобы упростить восприятие)
А на сервере такая хранимая процедура:
Генерируется ошибка: Syntax error converting the nvarchar 'dbo' to a column of data type int |
||||
|
|||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Дык у тебя входной параметр nvarchar(100), а поле, судя по названию (FIELD_INT) int, да и 13 строку убери - это я так, в качестве дебаггера использовал
либо делай одинаковыми и входной параметр и поле одного типа, либо используй CAST (CONVERT) для преобразования типов. |
|||
|
||||
| Juju |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Itsys, на самом деле все верно... просто я для форума переписывал процедуры, для наглядности чтения... Сейчас приведу полный пример приближенный к боевым - потому как скоро башка выкипит полностью...
Предмет: ПУСТЬ БУДЕТ: Таблица 3 поля:
Процедура на Delphi:
Процедура на MSSQL2000
Если не передаются параметры даты, то ошибка та, о которой я писал раньше: Syntax error converting the nvarchar 'dbo' to a column of data type int Если передаются параметры даты: Line 1: Incorrect syntax near '.2008' С CONVERT я пробовал разные значения style... но ошибка только меняется... |
||||||
|
|||||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
У меня вот так все работает:
ЗЫ Названия таблиц мои |
|||
|
||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: нет Всего: 1 |
Itsys, во-первых спасибо огромное, что возишься с моей проблемой
во-вторых СПАСИБЕЩЕ ТЕБЕ ОГРОМНОЕ за подсказку с конвертированием дат - все работает... Но вот беда.... при:
все равно выдает мне: Syntax error converting the nvarchar 'dbo' to a column of data type int |
|||
|
||||
| Itsys |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
у меня при пустых параметрах @d и @d2 тоже все работает правильно - значит проблема в том, что передается в параметр @user выведи итоговый запрос в print и посмотри, что там получается
У меня получается
Может у тебя чего-нибудь такое (судя по ошибке)
|
||||
|
|||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |