C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

  ЗакрытаНовая тема
Хранимые процедуры, ADO & SQLServer2000
Polar_bear
Отправлено: 26.04.2005, 12:02


Ученик-кочегар

Группа: Участник
Сообщений: 9



Всем привет, вопрос такой
Пишу хранимую процедуру. Там огромное количество входных параметров. Но вот в чем штука некоторые параметры могуть быть равны NULL некоторые 0, и процедура такие параметры должна игнорировать. В процедура рабочий код вот такого вида
CODE

Select * from TableName
   where  @Var1=Var_Table and
   where  @Var2=Var_Table2...

и так далее. Вот как бы сделать так чтобы проверить значения параметров и игнорировать если они NULL или 0
olegenty
Отправлено: 26.04.2005, 12:12


Ветеран

Группа: Модератор
Сообщений: 2412



есть варианты:
1. DSQL — плохой вариант
2. Ветвистое дерево всех вариантов — тоже плохой вариант: замучаешься его писАть
3. применение isnull — для строковых параметров это поможет, только придётся заменить "=" на "like" — опять плохой вариант, не будут использоваться индексы, вместо seek в плане получишь scan
4. комбинация вышеупомянутых способов.

в общем, думай сам. я бы ещё и логически побил на ряд процедур. которые бы объединялись этой большой.

а вообще, сходи на SQL.RU, возможно, там что-то ещё подскажут.
AVC
Отправлено: 26.04.2005, 12:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Там огромное количество входных параметров. Но вот в чем штука некоторые параметры могуть быть равны NULL некоторые 0, и процедура такие параметры должна игнорировать.

Лично я в таких случаях стараюсь использовать DSQL, но разрешать его на уровне клиента (значительно проще отлаживать, да и возможностей у C больше).
Если плевать на скорость и всякие оптимизации можно воспользоваться IsNull, Like.
Вот несколько приемов (синтаксис Oracle)
Select ...
Where ID = NVL(:pID, ID) — вернет все строки если параметр pID не заполнен или только те, где id = pID если заполнен

Select ...
Where NVL(ID, невозможное_значение) = :pID — вернет все строки где ID is Null если параметру присвоено невозможное_значение

Оба варианта в одном
NVL(ID, невозможное_значение) = NVL(:pID, NVL(ID, невозможное_значение))

Эти варианты плохи тем, что для построения выборки нужно просмотреть все строки таблицы или подзапроса.
xim
Отправлено: 26.04.2005, 14:25


Станционный диспетчер

Группа: Участник
Сообщений: 143



SQL
Select * from TableName where isnull(@Var1,0)=case isnull(@Var1,0) when 0 then 0 else Var_Table end and ...


Guest
Отправлено: 26.04.2005, 14:30


Не зарегистрирован







Всем спасибо. Моментально реагируете. Решение принял. Тему можно закрыть
Polar_bear
Отправлено: 26.04.2005, 14:32


Ученик-кочегар

Группа: Участник
Сообщений: 9



Забыл залогиниться, сорри smile.gif Это сверху я писал

Вернуться в Работа с базами данных в C++Builder
ЗакрытаНовая тема