powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с jobs
12 сообщений из 12, страница 1 из 1
Проблема с jobs
    #32038956
Aex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди помогите разобраться. Есть некий jobs который запускает по расписанию подряд несколько SP. В определённый момент времени jobs стал заканчиваться с ошибкой. В output файл пишет:

Job 'rebild_prikaz_tmp' : Step 1, 'st1' : Began Executing 26.07.02 8:58:56
Msg 512, Sev 16: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. [SQLSTATE 21000]
Msg 3621, Sev 16: The statement has been terminated. [SQLSTATE 01000]

Стартую SP, соответствующую Step 1 из query analyser. Работает без ошибок. Не знаю с какой стороны копать.
...
Рейтинг: 0 / 0
Проблема с jobs
    #32038962
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял у Вас ошибка как раз в sp, попробуйте запустить их отдельно. Вы где то сравниваете скалярное значение, со множеством. Например:
Код: plaintext
1.
2.
3.
4.
select *
from Table_1
where Table_1.Field_1 = (select Table_2.Field_1
		from Table_1)

В примере подзапрос из таблицы Table_2 возвращает множество Table_2.Field_1, а сравнивается это множество со скалярным значением поля Table_1.Field_1
...
Рейтинг: 0 / 0
Проблема с jobs
    #32038975
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во первых я указал, что из query analyser хранимая процедура, соответствующая шагу -step1 отрабатывает нормаль - без ошибок (что мне в сущности и не понятно).
Во вторых с подзапросами. Я рузумеется проверил все подзапросы в СП. Он оказался один такого вида:
Код: plaintext
1.
2.
3.
[/src]
select .. where date_out = 
(select  min(date_out) from prikaz_tmp)
[src]

Ну и на конец в третьих. Как я понял работу SP прерывает не первое предупреждение из log файла, а второе, которое не содержит коментариев и имеет вид:
Msg 3621, Sev 16: The statement has been terminated. [SQLSTATE 01000]
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039124
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По ходу дела ни кто jobs - ами не пользуется
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039127
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вотдельности сделать под каждую ХП отдельный job не пробовали,попробуйте може полегчает,да и баги при таком раскладе будет проще ловить,да и зашедульте их подряд,а то может у вас сторой step пытаеться отработать когда первый не закончился.
Свои проблеммы с job'ами лечил именно таким образом
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039132
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, недочитал последнюю строчку... Приведенный пример это для наглядности, ошибка может быть и в другом месте такого рода, трудно сказать не видя скрипта. Еще вариант, job запускается под тем же логином под каким Вы заходили в QA и тестировали процедуру? На счет того, что прерывает работу, мне кажется, 3621 идет после 512, значит 512 и прерывает, а потом ошибка 3621 завершает работу. 3621 - Инструкция была завершена.
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039134
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Проверьте еще раз ваши запросы/подзапросы. Потому как сообщенние об ошибке совершенно недвусмысленное.

2. Поставьте на всякий слкчай в начале процедуры SET NOCOUNT ON, если его там нет

3. Я бы сделал из многошагового job-а одношаговый с запуском DTS Package-а, в котором и разместил бы все процедуры
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039138
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не секрет, раскажите поподробнее о sp. А то так трудно угадывать :)
2 Glory. А в чем преимущество одношагового job-а с DTS перед многошаговым?
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039152
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2fima
Если вкратце, то лично для меня
- Если шаги должны выполненятся в определеннй последовательности, то смена очередности в job-е влечет за собой довольно много исправлений в разделе Step - Edit -Advanced - On success/on failure flow. Причем у всех шагов.
В DTS это все гараздо проще

- Если шаги могут выполнятся параллельно, то в job-е они все равно будут выполняться последовательно.
Т.е. 5 шагов по 5 мин дадут 25 мин на выполнение job-а
В DTS независиммые друг от друга шаги выполняются одновременно. Конечно это не будет 5 мин, но и не 25 это точно.

- Явной передачи параметров в какой-либо шаг job просто нет

- Ну и не забудем про ограниченность выбора типа запускаемых задач. По существу их 3
T-SQL, ActiveX и CmdExec. Согласитесь в DTS палитра несколько богаче.
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039183
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отдельные jobs для каждой SP пробовал не работает. Из QA работает. Логин оди и тот же. Мысль с DTS очень интересная. Но проблемы она не решает. Надо выяснить вчём ошибка. А вот сама SP если поможет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
[/src]
ALTER proc sp_create_prikaz_tmp AS

Delete from prikaz_tmp
declare @pers char ( 10 ),
	@date_in datetime,
	@date_out datetime,
	@d_in_prev datetime,
	@d_out_prev datetime,
	@d_out_prik datetime,
	@otd_prev char( 10 ),
	@otd char( 10 ),
	@first tinyint,
	@u_size dec( 14 , 2 ),
	@fl_uch char( 1 ),
	@fl_tmp char( 1 ),
	@cat char( 10 ),
	@tmp smallint,
	@date_2050 datetime
set @cat = '11'  --Категория ученики для ГОТЭКА
 
set @tmp =  61   -- Колличество дней врем работы
 
set @date_2050 = '2050-01-01'
declare cur cursor for 
select  pers_id from const
open cur
fetch cur into @pers
while @@fetch_status =  0  
begin
  set @first =  1 
  declare cur_jur cursor for 
  select distinct when_, when_ended, n_otd from y_jur_dot where pers_id = @pers and when_ended is not null and n_otd is not null
    order by when_
  open cur_jur
  fetch cur_jur into @date_in, @date_out, @otd
  while @@fetch_status =  0  
  begin
    if @first =  1   -- первая запись в журнале
 
    begin
      insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
        values ('001', @pers, @date_in, @date_2050, @otd, '1',  1 , @date_in)
    end else  -- НЕ первая запись в журнале
 
    begin
      select @d_out_prik = max(date_out) from prikaz where tip = '002' and (date_out between @d_in_prev and @d_out_prev) and pers_id = @pers
      if exists (select * from prikaz where tip = '001' and date_in = @date_in and pers_id = @pers )
        OR @d_out_prik is not null
        OR (@otd <> @otd_prev and (@otd in ('0001','d2','r83','r84') OR @otd_prev in ('0001','d2','r83','r84')))
      begin
        insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
          values ('001', @pers, @date_in, @date_2050, @otd, '1',  1 , @date_in)
        insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
          values ('002', @pers, @date_2050, isnull(@d_out_prik, isnull(@d_out_prev,@date_2050)), @otd_prev, '1', - 1 , isnull(@d_out_prik, @d_out_prev))
      end
      else
      begin
        if @otd <> @otd_prev
        begin
        insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
          values ('001', @pers, @date_in, @date_2050, @otd, '0',  1 , @date_in)
        insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
          values ('002', @pers, @date_2050,isnull(@d_out_prev,@date_2050), @otd_prev, '0', - 1 , @d_out_prev)
        end
      end
    end
    set @first =  0 
    select @d_in_prev = @date_in, @d_out_prev = @date_out, @otd_prev = @otd
    fetch cur_jur into @date_in, @date_out, @otd
  end
  close cur_jur
  deallocate cur_jur
  insert into prikaz_tmp (tip, pers_id, date_in, date_out, n_otd, fl_priem, unit_size, dt)
    values ('002', @pers, @date_2050, isnull(@d_out_prev,@date_2050), @otd_prev, '0', - 1 , @d_out_prev)
  fetch cur into @pers
end
close cur
deallocate cur

delete from prikaz_tmp where year(date_in) =  2050  and year(date_out) =  2050 

 --update prikaz_tmp set unit_size = 1
 

 -- Не целая ставка без  внутренних совмещений ПРИЁМ
 
update prikaz_tmp set unit_size = D.unit_size
FROM dol_unit D, prikaz_tmp P, y_jur_dunit Y
WHERE Y.dunit_kod = D.kod AND P.pers_id = Y.pers_id AND D.kod_podr = P.n_otd 
AND D.unit_size<> 1  AND (Y.date_begin between P.date_in AND P.date_out)
AND isnull(D.flag_multi,'0') <>  1  AND P.tip = '001'

 -- Не целая ставка без  внутренних совмещений УВОЛЬНЕНИЕ
 
declare cur cursor for
  select pers_id, date_in, n_otd, unit_size from prikaz_tmp 
    where fl_priem <>  2  AND unit_size <>  1  AND tip = '001'
 --order by pers_id, date_
 
open cur
fetch cur into @pers, @date_in, @otd, @u_size
while @@fetch_status =  0 
begin
  update prikaz_tmp set unit_size = @u_size
  where pers_id = @pers AND n_otd = @otd and date_out =
  (select  min(date_out)
    from prikaz_tmp
    where fl_priem <>  2  AND tip = '002' and date_out >= @date_in AND pers_id =@pers 
    AND n_otd = @otd
    group by pers_id, n_otd, unit_size)
  fetch cur into @pers, @date_in, @otd, @u_size
end
close cur
deallocate cur

 -- принять по внутреннему совмешению
 
insert into prikaz_tmp 
  SELECT '001', M.pers_id, M.date_begin, @date_2050, D.kod_podr, '2', D.unit_size ,  M.date_begin, '0', '0'
  FROM dol_unit D, dunit_multiwork M 
  WHERE D.kod = M.dolunit  --AND M.date_end is null
 
 -- Уволить по внутреннему совмешению
 
insert into prikaz_tmp
  SELECT '002', M.pers_id, @date_2050, M.date_end, D.kod_podr, '2',  0 . 0  - D.unit_size ,  M.date_end, '0', '0'
  FROM dol_unit D, dunit_multiwork M 
  WHERE D.kod = M.dolunit AND M.date_end is not null

 --update prikaz_tmp set unit_size = 0 - ABS(unit_size) where tip = '002'
 
update prikaz_tmp set dt = date_in where year(date_out) =  2050 
update prikaz_tmp set dt = date_out where year(date_in) =  2050 

GO
[src]
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039194
Димыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
....AND n_otd = @otd and date_out =
(select min(date_out)
from prikaz_tmp
where fl_priem <> 2 AND tip = '002' and date_out >= @date_in AND pers_id =@pers
AND n_otd = @otd
group by pers_id, n_otd, unit_size)

В этом подзапросе возвращается несколько строк, т.к. используется оператор 'Group by'. Об этом и сообщал SQLServer.
...
Рейтинг: 0 / 0
Проблема с jobs
    #32039600
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята всем спасибо. Действительно проблема крылась в подзапросе. QA ошибок не возвращал из за SET NOCOUNT OFF. Просто изначально не предполагалось иметь 2 запаси с одинаковыми date_out для одного сотрудника. Пользователи умудрились их вдолбить. Надо поставить дополнительное ограничение.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с jobs
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]