Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert внутри Case. Помогите решить задачку.  [new]
pr0b3l1987
Member

Откуда:
Сообщений: 14
Уважаемые знатоки, здравствуйте!

Есть задачка:
На вход подается число. Это число сравнивается с диапазоном значений из таблицы 2, и если оно НЕ находится в данной таблице, проверяется условие, четность недели, и в зависимости от того, четная неделя или нечетная, в таблицу 2 вставляется диапазон времени.
Собственно, мой скрипт:

SELECT
	CASE WHEN CURRENT_TIMESTAMP NOT Between (SELECT MAX(start) From table2) and (SELECT MAX(finish) From table2)
		THEN
			CASE WHEN (DATEPART(WEEK, CURRENT_TIMESTAMP)%2)=1 
				THEN
					GO
					INSERT INTO table2
					(start
				       ,finish)
				VALUES
					(CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+1,CAST(Current_timestamp as Date)) as datetime)
					,DATETIMEFROMPARTS(DATEPART(YEAR, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),DATEPART(MONTH, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),DATEPART(day, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),23,59,59,000)
					GO
				ELSE
					GO
					INSERT INTO table2
					(start
				       ,finish)
				VALUES
					(CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+1,CAST((Current_timestamp+7)-7 as Date)) as datetime)
                                        ,DATETIMEFROMPARTS(DATEPART(YEAR, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),DATEPART(MONTH, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),DATEPART(day, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),23,59,59,000)
					GO
			END
	
          END



Собственно, вопрос в чем, как заставить выполняться insert только в одном месте, куда попадает число? почему он делает сразу оба инсерта?
Вероятно, понимаю, что дело именно в GO, нооо, как поступить правильно, пока не пойму.
Спасибо!

Модератор: Тема перенесена из форума "MySQL".


Сообщение было отредактировано: 6 сен 17, 20:37
6 сен 17, 16:07    [20776054]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2959
pr0b3l1987,

IF (CURRENT_TIMESTAMP NOT Between (SELECT MAX(start) From table2) and (SELECT MAX(finish) From table2))
BEGIN
	IF (DATEPART(WEEK, CURRENT_TIMESTAMP)%2)=1 
	BEGIN
		INSERT INTO table2
		(start
	       ,finish)
		VALUES
		(CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+1,CAST(Current_timestamp as Date)) as datetime)
		,DATETIMEFROMPARTS(DATEPART(YEAR, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),DATEPART(MONTH, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),DATEPART(day, CAST(DATEADD(Day, 1-Datepart(Weekday, Current_timestamp)+14,CAST(Current_timestamp as Date)) as datetime)),23,59,59,000)
	END
	ELSE
	BEGIN
		INSERT INTO table2
		(start
		,finish)
		VALUES
		(CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+1,CAST((Current_timestamp+7)-7 as Date)) as datetime)
                ,DATETIMEFROMPARTS(DATEPART(YEAR, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),DATEPART(MONTH, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),DATEPART(day, CAST(DATEADD(Day, 1-Datepart(Weekday, (Current_timestamp+7))+7,CAST((Current_timestamp+7) as Date)) as datetime)),23,59,59,000)
	END
END
7 сен 17, 06:54    [20777062]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
Господин Уэф!
Member

Откуда:
Сообщений: 267
pr0b3l1987,

1. Не надо тут GO
2. Возьмите в привычку даже если 1 оператор, брать его в скобки begin ... end
7 сен 17, 07:29    [20777094]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Господин Уэф!,

2. Возьмите в привычку даже если 1 оператор, брать его в скобки begin ... end

О господи, это вы где это такому научились?
7 сен 17, 09:37    [20777360]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
felix_ff
Господин Уэф!,

2. Возьмите в привычку даже если 1 оператор, брать его в скобки begin ... end

О господи, это вы где это такому научились?

индусы на количесвтво знакв работают :)
7 сен 17, 09:44    [20777390]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
pr0b3l1987
Member

Откуда:
Сообщений: 14
HandKot,

Спасибо за помощь!
Сейчас попробую.
7 сен 17, 09:50    [20777409]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
pr0b3l1987
Member

Откуда:
Сообщений: 14
Всем спасибо за критику и ответы!
7 сен 17, 09:52    [20777413]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
felix_ff
Господин Уэф!,

2. Возьмите в привычку даже если 1 оператор, брать его в скобки begin ... end

О господи, это вы где это такому научились?

Это хороший способ подложить соломки и заранее избавить себя от возможных багов такого вида:

if условие
do smth
do smth else
do smth else

Логически все три оператора должны выполняться только при выполнении условия, по факту, последние два выполняются всегда.
Когда do smth else дописывается через некоторое время после создания основного кода, есть шанс забыть добавить begin end. Ошибка глупая, но если вы скажете, что никогда не допускали глупых ошибок в коде - я в первую очередь спрошу у вас - а сколько строк кода вы вообще написали.
7 сен 17, 10:20    [20777530]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto
felix_ff
Господин Уэф!,

пропущено...

О господи, это вы где это такому научились?

Это хороший способ подложить соломки и заранее избавить себя от возможных багов такого вида:

if условие
do smth
do smth else
do smth else

Логически все три оператора должны выполняться только при выполнении условия, по факту, последние два выполняются всегда.
Когда do smth else дописывается через некоторое время после создания основного кода, есть шанс забыть добавить begin end. Ошибка глупая, но если вы скажете, что никогда не допускали глупых ошибок в коде - я в первую очередь спрошу у вас - а сколько строк кода вы вообще написали.

Редактор форума съел отступы, стало менее понятно, что я имел в виду :( Исправляюсь, кусок кода должен был так выглядеть:

if условие
do smth
do smth else
do smth else
7 сен 17, 10:21    [20777535]     Ответить | Цитировать Сообщить модератору
 Re: Insert внутри Case. Помогите решить задачку.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Minamoto,

Я не спорю что begin end полезная конструкция. Но в частности применяется как раз в при ветвлении и там она необходима, но писать ее для каждой инструкции пакета просто глупо особенно если программист брезгует отступами. А тем более если она встречается уже в конструкции обрамленной be и просто начинает запутывать какой end от какого begins (не рассматриваю сейчас всяческие надстройки по подсветке синтаксиса и выделению блоков кода) ну и да - чисто имхо
7 сен 17, 10:27    [20777571]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить