Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Процедурные параметры в where / 6 сообщений из 6, страница 1 из 1
27.11.2001, 10:44
    #32017872
Yorik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурные параметры в where
Коллеги не подкинете ли идейку аль реализацию оной по решению следующей проблемы:
Есть входные параметры у процедурочки. Суть этой процедурочки - запросик, а запросик этот с горизонтальным фильтриком Where, а фильтрик этот жаждет получить те самые входные параметры процедурочки, а входные параметры динамические, то бишь могет один будет введен, могет два, могет ....... Слепить их в Where не составит труда, но вот определить добавлять ли and перед параметром(вдруг он первый). Прям засада какая-то получается
Например:
CREATE PROCEDURE TUTU
@a varchar(50) = null,
@b varchar(50) = null,
@c varchar(50) = null
.......
AS
declare
@sql varchar(200)
set @sql='Select Field1, Field2, Field3 ..... From Table '
if @a is not null or @b is not null or @c is not null.....
set @sql=@sql+'where '

А дальше?
...
Рейтинг: 0 / 0
27.11.2001, 10:58
    #32017875
Процедурные параметры в where
set @sql=@sql+'where 1=1 '
а все параметры добавлять с предваряющим ' AND '
...
Рейтинг: 0 / 0
27.11.2001, 11:08
    #32017878
Yorik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурные параметры в where
Ой-ля-ля
Все гениальное просто. Большой спасибомс.
...
Рейтинг: 0 / 0
27.11.2001, 11:26
    #32017879
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурные параметры в where
еще можно не делать динамический запрос, а писать селект как-то так:
CREATE PROCEDURE TUTU
@a varchar(50) = null,
@b varchar(50) = null,
@c varchar(50) = null
.......
AS
Select Field1, Field2, Field3 ..... From Table
where (FieldA=@a or @a is null) and (FieldB=@b or @b is null) and (FieldC=@c or @c is null)
...
Рейтинг: 0 / 0
27.11.2001, 12:33
    #32017884
Процедурные параметры в where
Так делать нежелательно по соображениям производительности. Операции OR препядствуют эффективному использованию индексов оптимизатором. Как раз динамический запрос в данном случае эффективнее, а время затрачиваемое на составление плана запроса пренебрежимо мало по сравнению со временем исполнения запроса. В данном случае играет существенную роль свойство динамического запроса - всегда актуальный план запроса при любых параметрах. В статическом запросе (процедуре) с параметрами план получается наиболее эффективным только при значениях параметров, которые были при первом запуске запроса. При других значениях параметров план исполнения не будет являться оптимальным, особенно в запросах, где значение параметра меняет логику критериев выборки типа "where (FieldA=@a or @a is null)".
...
Рейтинг: 0 / 0
30.11.2001, 08:59
    #32018194
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурные параметры в where
Согласен с Глебом. Добавлю только, что когда возникает желание написать что-то вроде ...where FieldA=@a or @a is null, я избавляюсь от "or" следующим образом:
...where IsNull(@a,FieldA)=FieldA
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Процедурные параметры в where / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]