![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как использовать в запросе результат из хранимой процедуры [MSSQL]
Раиса © (2010-01-26 15:57:00)В QA выполняю:
declare @date_from datetime
set EXECUTE @date_from=dbo.last_run_job 'A_s_p'
print @date_from
dbo.last_run_job 'A_s_p' - это хранимая процедура, в конце которой выполняется select, возвращающий одно поле типа datetime
Нужно в DTS-пакете в Transform Data Task использовать полученную переменную в select. Выдается ошибка (некорректный синтаксис).
Помогите, пожалуйста.
Раиса (2010-01-27 15:30:00) [1]Вставила set nocount on в текст процедуры и отработал пакет. Помогли на sql.ru.
Спасибо всем, советы помогли.
Раиса (2010-01-27 12:53:00) [2]stas © (27.01.10 08:50) [19]
Спасибо за совет, воспользовалась.
Теперь всё сначала. Напишу, как на sql.ru
Создала новый пакет. Могу отлаживаться. В хранимой процедуре использую постоянную таблицу. Кинула 3 компонента. Источник и приемник связала. В Transform Data Task пытаюсь вставить запрос, который В QA отрабатывает (код ниже).
declare @date_from datetime
EXECUTE dbo.last_run_job 'ARPU_sigma_positions' , @date_from OUT
set @date_from=@date_from-(select datediff(hh,getutcdate(),getdate()))/24.0
select * from pos_twin
where datetime>=@date_from
В DTS-пакете не отрабатывает. На выполнении выдается ошибка. При "двойном щелчке" говорит неправильный указатель.
Что у меня не так?
turbouser (2010-01-27 11:13:00) [3]
> Раиса © (27.01.10 11:06) [25]
В общем-то на скл.ру ответили..
Раиса (2010-01-27 11:06:00) [4]ЗАПРОСЫ НЕ МОИ, ПЕРЕПИСЫВАТЬ НАДО НЕ ИХ!!! НАДО ЗАМЕНИТЬ ОДНУ ПЕРЕМЕННУЮ.
Ошибка при parse Query.........................
turbouser (2010-01-27 10:55:00) [5]
> Раиса © (27.01.10 10:50) [22]
Ну, во первых, если уж используются алиасы, то и в селекте надо их использовать. типа а. board_number, и т.п.
а вот за такое , datetime,- мм.. не надо так делать :) и если уж "так получилось", то хотя бы [datetime]
а где тут
> Ошибка: invalid object name ##имя моей временной таблиц
> (при проверке синтаксиса).
? "##имя моей временной таблиц" здесь нет..
stas (2010-01-27 10:50:00) [6]А если выполнить не в DTS работает?
Раиса (2010-01-27 10:50:00) [7]Задала вопрос на sql.ru, там код есть.
http://www.sql.ru/forum/actualthread.aspx?tid=730251
И сюда напишу (удалила только ненужные комментарии, типа кто и когда вставлял строку, всё прямо из Transform Data Task ):
declare @date_from datetime
declare @date_to datetime
set @date_to = getutcdate()
EXECUTE dbo.last_run_job 'ARPU_sigma_positions' , @date_from OUT
SELECT board_number, datetime, dbo.MakeLatitude(Latitude) lat, dbo.MakeLongitude(longitude) lon, course, velocity
JOIN dbo.fn_zd_cd(@date_from, @date_to, 'zh(21)') f on f.id_pos=a.id_pos
from pos_twin a WITH (NOLOCK)
JOIN dbo.fn_zd_cd (@date_from, @date_to, 'zh(21)') f on f.id_pos=a.id_pos
left join ves on ves.id_ves=a._id_ves
left join own on ves.id_own=own.id_own
where a.sinhronized in (0,1,2)
order by iki_own, iki_ves
turbouser (2010-01-27 10:40:00) [8]
> Раиса © (27.01.10 09:30) [20]
> Ошибка:
код процедуры можно увидеть?
Раиса (2010-01-27 09:30:00) [9]Transform Data Task = "черная стрелочка".
stas © (27.01.10 08:50) [19]
Процедуру исправила. Написала
declare @date_from datetime
EXECUTE dbo.myprocedure 'A_s_p' , @date_from OUT
Ошибка: invalid object name ##имя моей временной таблиц (при проверке синтаксиса).
stas (2010-01-27 08:50:00) [10]
> Раиса © (26.01.10 21:03) [15]
>
> Про out параметры слышала, но никогда ничего не писала с
> их использованием....
create procedure myprocedure
@par1 nvarchar(50)
@par2 datetime out
as
begin
...
set @par2 = (select mydatetimefield from mytable where...)
end
вызов
declare @date_from datetime
EXECUTE dbo.myprocedure 'A_s_p' , @date_from OUT
sniknik (2010-01-26 23:46:00) [11]> но здесь речь идет о "черной стрелочке"...
а как это будет по русски, о чем речь?
Раиса (2010-01-26 23:29:00) [12]Попробовать смогу только завтра то, что предложено turbouser © (26.01.10 19:48) [13], но не верю, так как можно использовать только один select с нужными полями для трансформации в dbf.
С курсорами писала хранимые процедуры, но здесь речь идет о "черной стрелочке"...
Когда я пробовала писать в Transform Data Task какой-либо select (кроме того, который выдает поля для dbf), то "съезжало" в destination всё и оставалось одно поле с датой...
Мне надо примерно так:
SELECT * from nametable where pdatetime>=(select переменная из хранимой процедуры) ...
Ничего кроме declare,set и одного select писать нельзя (это моё мнение, которое может быть ошибочным) в Transform Data Task ....
sniknik (2010-01-26 21:10:00) [13]> Не представляю, как мне поможет курсор
им можно выбрать записи из рекордсета
> и как его использовать.
а вот это другое дело. обратись в хелп.
хотя... способ предложенный в turbouser © (26.01.10 19:48) [13], на порядок проще, и лучше (и чего я про это сразу не подумал...), т.что можно не отвлекаться.
Раиса (2010-01-26 21:03:00) [14]Про out параметры слышала, но никогда ничего не писала с их использованием....
sniknik © (26.01.10 19:19) [11]
sniknik © (26.01.10 19:23) [12]
Не представляю, как мне поможет курсор и как его использовать.
Раиса © (26.01.10 16:30) [4]
надо в "черной стрелке" написать
Было так (в упрощенном виде) :
declare @date_from datetime
set @date_from=getdate()-1
SELECT * from nametable where pdatetime>=@date_from
Значение @date_from надо заменить на значение из хранимой процедуры. Казалось, что проблем не будет....VBScript-а в DTS нет, только "банки" и "стрелки".
turbouser (2010-01-26 19:49:00) [15]Хотя, с out параметром более адекватно выглядит
turbouser (2010-01-26 19:48:00) [16]можно еще так :)
declare @T table (date_from datetime)
inserert @T exec dbo.last_run_job 'A_s_p'
select @date_from=date_from from @T
sniknik (2010-01-26 19:23:00) [17]кстати если не получится прямо использовать процедуру в курсоре то можно попробовать "трюк", вложить процедуру в openrowset с указанием "на себя". а из него селект, с селектом то по любому должно сработать.
sniknik (2010-01-26 19:19:00) [18]> в конце которой выполняется select, возвращающий одно поле типа datetime
если делает селект то возвращает рекордсет, на который можно попробовать "повесить" курсор...
не знаю получится ли, не пробовал так.
12 (2010-01-26 16:56:00) [19]ну, наверное, как-то можно.. :)
но все же, имхо, проще держать таблицы вида
tmpDTSExport_1C
tmpDTSExport_Site
Раиса (2010-01-26 16:48:00) [20]12 © (26.01.10 16:44) [8]
не то.... Мне надо всего лишь в чужом DTS пакете изменить значение одной переменной, взяв ее из хранимой процедуры (в которой есть create временной таблицы, insert.... )