![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно написать хранимую процедуру? [D6, MSSQL]
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+")"
Я решил это точно так же. Другого пути не узрел, хотя долго пытался.