Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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'"
Если понятно объяснил, подскажите, пожалуйста, как реализовать мою задачу? Благодарю за внимание, уделенное моему вопросу. |
|
Вернуться к началу |
|
|
khm Гость
|
Добавлено: Вс Июн 06 2004 22:46 Заголовок сообщения: |
|
|
Я извиняюсь, но может я непонятно объяснил, или ни у кого нет времени, или спецы ещё не читали мой вопрос?
Пожалуйста, ответье кто-нибудь. |
|
Вернуться к началу |
|
|
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ом с таблицей ничего я думаю не сделаешь
Есть другой способ: создать временную таблицу, скинуть туда записи(нужные столбцы) из Sessions, в этой таблице и добавлять поле Rate. А здесь уже другой вопрос: если использовать триггер на добавление записи в новую таблицу, то как это все будет работать - ведь добавляется сразу целая куча записей и как для каждой из них вызывать процедуру?
1)---------------
Mikle писал(а): | Зачем использовать Stored Procedure
Использую ф-ю. Скалярную ф-ю можно будет вставлять в запрос так, как если бы это было бу обычное поле таблицы. |
Так, вроде у меня получилось этим способом. Я переделал StoredProcedure в Function, вроде работает. Спасибо. Появятся вопросы, буду мучать ими Еще раз спасибо и cerber-у, и Mikle-у. |
|
Вернуться к началу |
|
|
|