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

Откуда:
Сообщений: 123
Написал такую процедуру, передавая параметром в которую название определенной базы данных можно импортировать только в нее данные

Процедура:
+
CREATE PROCEDURE [dbo].[p_import] @DB_MSSQL nvarchar(20), @PK nvarchar(20), @From nvarchar(10)

AS
BEGIN


       -- Если указана база клиента, то выполняется выгрузка только по ней

IF @DB_MSSQL = 'GT'
    


BEGIN

       -- Если указан конкретный кабинет, то выполняется выгрузка только по нему

	   IF @PK = 'F'
	   BEGIN
		 EXEC [SECURE_DB].[dbo].[p_importing_F];
	   END
	   ELSE
	   BEGIN
		   IF @PK = 'Y'
		   BEGIN
			 EXEC [SECURE_DB].[dbo].[p_importing_Y];
		   END
		   ELSE
		   BEGIN
			   IF @PK = 'A'
			   BEGIN
				 EXEC [SECURE_DB].[dbo].[p_importing_A];
			   END
			   ELSE
			   BEGIN
				   IF @PK = 'V'
				   BEGIN
					 EXEC [SECURE_DB].[dbo].[p_importing_V];
				   END
				   ELSE
				   BEGIN
	   
                    ...
					
				   END
			   END
		   END
	   END
END	



Когда выполнял ее вызов
EXEC [SECURE_DB].[dbo].[p_importing_advertising] 'GT', 'Y', NULL

то она не останавливалась на блоке Y, а продолжала выполняться и для блока A, V..? ,без завершения

Работать процедура начал нормально только после добавления RETURN

+
CREATE PROCEDURE [dbo].[p_import] @DB_MSSQL nvarchar(20), @PK nvarchar(20), @From nvarchar(10)

AS
BEGIN


       -- Если указана база клиента, то выполняется выгрузка только по ней

IF @DB_MSSQL = 'GT'
    


BEGIN

       -- Если указан конкретный кабинет, то выполняется выгрузка только по нему

	   IF @PK = 'F'
	   BEGIN
		 EXEC [SECURE_DB].[dbo].[p_importing_F];
	   END
	   ELSE
	   BEGIN
		   IF @PK = 'Y'
		   BEGIN
			 EXEC [SECURE_DB].[dbo].[p_importing_Y];
                         RETURN
		   END
		   ELSE
		   BEGIN
			   IF @PK = 'A'
			   BEGIN
				 EXEC [SECURE_DB].[dbo].[p_importing_A];
			   END
			   ELSE
			   BEGIN
				   IF @PK = 'V'
				   BEGIN
					 EXEC [SECURE_DB].[dbo].[p_importing_V];
				   END
				   ELSE
				   BEGIN
	   
                    ...
					
				   END
			   END
		   END
	   END
END	


Объясните пожалуйста, почему выполнение процедуры [SECURE_DB].[dbo].[p_importing_Y] в процедуре [SECURE_DB].[dbo].[p_import] не прекращалось, хотя было точно (на мой субъективный взгляд:) ) указано на условия выполнения и прекращения?
10 сен 17, 14:28    [20784796]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
aleks222
Guest
Т.е. ты прошагал в отладчике процедуру или хоть натыкал print ... в ключевых точках?

Ибо звучит невероятно.

ЗЫ. Давеча у мя тоже if работал криво... но виноватый был я - begin криво расставил.
10 сен 17, 16:09    [20784872]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Тем более, в приведённом примере не надо ни одного begin и ни одного end
10 сен 17, 16:56    [20784926]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
hulk77
Member

Откуда:
Сообщений: 123
iap
Тем более, в приведённом примере не надо ни одного begin и ни одного end


Без begin и end возникает ошибка в синтаксисе, если указано выполнение двух процедур последовательно в блоке
10 сен 17, 18:22    [20785069]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
hulk77
Объясните пожалуйста, почему выполнение процедуры [SECURE_DB].[dbo].[p_importing_Y] в процедуре [SECURE_DB].[dbo].[p_import] не прекращалось

Откуда вы знаете, что у вас выполняется? принтов нет.
У вас и не должно прекращаться, должен выполнится блок IF @PK = 'V'... ELSE

Кроме того, посмотрите типичную ошибку - правите процедуру в одной базе, вызываете в другой
11 сен 17, 00:58    [20785510]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
hulk77
Без begin и end возникает ошибка в синтаксисе, если указано выполнение двух процедур последовательно в блоке
У вас нет "выполнение двух процедур последовательно в блоке"

Или вы показываете "теоретический" код?

"Теоретически" всё правильно, просто отладьте ваш код.
11 сен 17, 01:00    [20785512]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
hulk77
Member

Откуда:
Сообщений: 123
alexeyvg, спасибо
11 сен 17, 12:13    [20786250]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение процедуры в IF...ELSE  [new]
dies irae
Member

Откуда:
Сообщений: 78
ms sql позволяет имя процедуры динамически формировать:

declare @proc_name nvarchar(250) = 'SECURE_DB.dbo.p_importing_' + @PK 
EXEC @proc_name

и не нужно всех этих if-else
11 сен 17, 12:41    [20786380]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить