Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно написать хранимую процедуру? [D6, MSSQL]


Страницы:   1 2

AndrewK ©   (2003-12-23 09:50:00) 

Доброго времени суток, господа.

Подскажите, как можно написать процедуру с датасетом в описании.

Например, необходимо написать процедуру, которая формирует отчет по использованию каких-нибудь ТМЦ.

Если требуется вывести отчет по одной ТМЦ, то процедура будет иметь вид

GetReport @ID int, @DateStart datetime, @DateStop datetime

Если по всем, то

GetReport @DateStart datetime, @DateStop datetime

А как мне сделать так, чтобы отчет вернул выборку по нескольким позициям, которые я в клиенте отмечу в checkbox.

GetReport @IDList что-то, @DateStart datetime, @DateStop datetime

Пока использую следующую схему:

GetReport @IDList varchar(1000), @DateStart datetime, @DateStop datetime

declare @SQL varchar(8000)
select @SQL = "select * from Table where id in ("+@IDList+")"

Exec(@SQL)



Но что-то мне не нравиться этот метод - за строками надо следить, да и с региональными настройками иногда проблемы, да и анализатор кода в данном случае не работает.

Вопрос собственно в том как в процедуру передать набор данных с кодами и как их потом можно использовать в теле процедуры.


Sandman25   (2003-12-23 10:57:00) [21]

Я извиняюсь, но в MSSQL нет временных таблиц?


Nikolay M.   (2003-12-23 10:56:00) [22]


> Ega23 © (23.12.03 10:23) [4]
> Кстати, а чем конкретно способ не нравиться?



> exec(@SelectSQL)


Ega23   (2003-12-23 10:23:00) [23]

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


Ega23   (2003-12-23 10:21:00) [24]

Есть другое решение.
Заводишь ещё один параметр для процедуры @IDList varchar(8000)=""
На клиенте формируешь такую строку "523,789,6546,55,87,14378,788,6979"

А сам запрос внутри процедуры генеришь динамически, что-то типа:

declare @SelectSQL varchar (8000)

Set @SelectSQL=
"Select * from Table1 where 0=0"

if @DateStart>0 Set @SelectSQL=@SelectSQL+" and "+
"DateStart>="+Cast(Cast(@DateStart as Int) as varchar)+" "

if @DateStop>0 Set @SelectSQL=@SelectSQL+" and "+
"DateStop>="+Cast(Cast(@DateStop as Int) as varchar)+" "+

if @IDList<>"" Set @SelectSQL=@SelectSQL+" and "+
"ID in ("+@IDLIST+")"

exec(@SelectSQL)


Nikolay M.   (2003-12-23 10:18:00) [25]

Да, динамический SQL - это не есть хорошо. Как вариант - можно с клиента заполнять ID-шками временную или псевдовременную таблицу и джойнить с ней нужную.


Shirson   (2003-12-23 09:59:00) [26]

Это очень больной вопрос.

Я докатился до такого же решения:
На клиенте отрабатывается некий query, который имеет тучу параметров, получаемых от пользователя и жужжит достаточно долго. В результате он выдаёт курсор. Этот курсор нужно передать sp... решение родилось такое - клиентская часть берёт все id, полученные на клиенте и формиует их в строку вида "(523,789,6546,55,87,14378,788,6979)" После чего отдаёт эту строку sp.
sp берёт строку и делает с ней ... именно:
select @SQL = "select * from Table where id in ("+@IDList+")"
Я решил это точно так же. Другого пути не узрел, хотя долго пытался.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо