Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

MSSQL Server2000SP2 -Запуск процедуры внутри запроса SELECT.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
khm
Гость





СообщениеДобавлено: Сб Июн 05 2004 16:54    Заголовок сообщения: MSSQL Server2000SP2 -Запуск процедуры внутри запроса SELECT. Ответить с цитатой

Имеется MS SQLServer2000. В базе данных следующая таблица и процедура:
===========
1)Таблица Sessions (таблица "Сессии" с данными по звнкам)
-----------
Session_id -идентификатор сессии(int)
Number -набранный номер (varchar[32])
OpenDate -дата начала разговора(datetime)
CloseDate -дата окончания разговора(datetime)
IPAddress -IP-адрес шлюза через который шел звонок(varchar[32])
===========
2) Процедура __spSelectProvRateByIP возвращает тариф провайдера.
Этой процедуре передаются следующие параметры, которые описаны внутри скрипта процедуры перед AS:

@Nomer - Номер звонка (например, 70957777777 - звонок в Москву на номер 777-77-77)
@IPAddress - IP-адрес шлюза одного из провайдеров, через которого звонок шел
@OpenDate - Дата начала звонка(разговора) - у провайдера тарифы могли меняться,
поэтому выбирается актуальный для этого звонка тариф провайдера
Тариф выбирается из другого набора таблиц с указанными выше параметрами. Отдельно процедуру тестировал - работает.

Вопрос в следующем: как мне соорудить выборку (SELECT) данных из таблицы Sessions, чтобы при
этом для каждой сессии указывался тариф провайдера, через которого этот звонок шёл.
В результирующей выборке должны быть следущие записи:

Session_id ,Number ,OpenDate ,CloseDate ,IPAddress ,Rate

т.е. для удовлетворяющих заданному интервалу времени звонков определить тариф
провайдера(он определяется IP-адресом), через которого он(звонок) шел.
Написал следующий запрос, но не получается.
======================================================================
declare
@OpenDate datetime ,
@CloseDate datetime

set @OpenDate = '2003.06.05 00:00:00'
set @CloseDate = '2003.06.05 23:59:59'

SELECT Sessions.Session_ID, Sessions.OpenDate,
Sessions.CloseDate, Sessions.Number,
Sessions.IPAddress,
(exec __spSelectProvRateByIP Sessions.Number ,Sessions.IPAddress, dbo.tbSessions.dtOpenDateTime) as Rate

FROM Sessions
WHERE (Sessions.OpenDate >= @OpenDate)
AND (Sessions.CloseDate <= @CloseDate)
======================================================================
Я делал так, что процедура возвращает тариф и через SELECT, и через OUTPUT параметр.
В обоих случаях запрос не проходил - писал что-то вроде "Incorrect syntax near the keyword 'exec'"
Если понятно объяснил, подскажите, пожалуйста, как реализовать мою задачу? Razz Благодарю за внимание, уделенное моему вопросу.
Вернуться к началу
khm
Гость





СообщениеДобавлено: Вс Июн 06 2004 22:46    Заголовок сообщения: Ответить с цитатой

Я извиняюсь, но может я непонятно объяснил, или ни у кого нет времени, или спецы ещё не читали мой вопрос? Confused
Пожалуйста, ответье кто-нибудь.
Вернуться к началу
cerber



Зарегистрирован: 19.12.2003
Сообщения: 296
Откуда: Казахстан, Актюбинск

СообщениеДобавлено: Пн Июн 07 2004 08:43    Заголовок сообщения: Ответить с цитатой

Код:

declare
@OpenDate datetime ,
@CloseDate datetime

set @OpenDate = '2003.06.05 00:00:00'
set @CloseDate = '2003.06.05 23:59:59'

SELECT Sessions.Session_ID, Sessions.OpenDate,
Sessions.CloseDate, Sessions.Number,
Sessions.IPAddress,
(exec __spSelectProvRateByIP @Nomer=Sessions.Number ,@IPAddress =Sessions.IPAddress, @OpenDate =dbo.tbSessions.dtOpenDateTime) as Rate

FROM Sessions
WHERE (Sessions.OpenDate >= @OpenDate)
AND (Sessions.CloseDate <= @CloseDate)

А так попробуй.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
khm
Гость





СообщениеДобавлено: Пн Июн 07 2004 17:18    Заголовок сообщения: Ответить с цитатой

cerber, попробовал - и так не получается(как и предполагалось).
Может этим способом не получится вообще(в смысле вызов процедуры из SELECTа) ? Может это как нибудь по другому можно сделать? Но чтоб при этом система желательно как можно меньше загружалась.
Вернуться к началу
cerber



Зарегистрирован: 19.12.2003
Сообщения: 296
Откуда: Казахстан, Актюбинск

СообщениеДобавлено: Вт Июн 08 2004 08:22    Заголовок сообщения: Ответить с цитатой

можно сделать так: добавляешь в таблицу session ешё одно поле Rate, затем проходишся курсором по таблице и расставляешь тариф.
Будет долго.
Делаешь выборку и всё.
Вызов процедуры можно сделать в тригере на добавление записи.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mikle
Гость





СообщениеДобавлено: Вт Июн 08 2004 13:42    Заголовок сообщения: Ответить с цитатой

Зачем использовать Stored Procedure
Использую ф-ю. Скалярную ф-ю можно будет вставлять в запрос так, как если бы это было бу обычное поле таблицы.
Вернуться к началу
Гость






СообщениеДобавлено: Вт Июн 08 2004 18:49    Заголовок сообщения: Ответить с цитатой

1)---------------
cerber писал(а):
можно сделать так: добавляешь в таблицу session ешё одно поле Rate, затем проходишся курсором по таблице и расставляешь тариф.
Будет долго.
Делаешь выборку и всё.
Вызов процедуры можно сделать в тригере на добавление записи.

Не хотелось бы трогать эту таблицу(эта БД поставлялась с биллингом, так что не хочется оставлять авторам биллинга возможности сослаться на наши действия в случае каких либо "неполадок" - а простым SELECTом с таблицей ничего я думаю не сделаешьSmile
Есть другой способ: создать временную таблицу, скинуть туда записи(нужные столбцы) из Sessions, в этой таблице и добавлять поле Rate. А здесь уже другой вопрос: если использовать триггер на добавление записи в новую таблицу, то как это все будет работать - ведь добавляется сразу целая куча записей и как для каждой из них вызывать процедуру?

1)---------------
Mikle писал(а):
Зачем использовать Stored Procedure
Использую ф-ю. Скалярную ф-ю можно будет вставлять в запрос так, как если бы это было бу обычное поле таблицы.

Так, вроде у меня получилось этим способом. Я переделал StoredProcedure в Function, вроде работает. Спасибо. Появятся вопросы, буду мучать ими Smile Еще раз спасибо и cerber-у, и Mikle-у.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...