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

Откуда:
Сообщений: 43
Доброго времени суток. чето сталкнулся с такой проблеймой, как можно зделать выход из процедуры и вывести сообщения об ошибки? Пишу так:
	SET NOCOUNT ON
	
	DECLARE @Error INT

	SET @Error = 0
	SET @NowDT = ISNULL(@NowDT, GETDATE())
	
	IF @NowDT < @DeliveryDT BEGIN
		SET @Error = -1 
		ROLLBACK TRAN
		RETURN @Error	
	END

Но веравно возвращает 0, в чем может быть проблема? И как можно передать сообщение на клиент?
23 май 11, 13:25    [10694025]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В том, что вы свой код не отладили, видимо.
23 май 11, 13:28    [10694054]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kamenyka,

а где процедура-то?
Нехорошо делать ROLLBACK TRANSACTION, если не делал BEGIN TRANSACTION
Даже @@TRANCOUNT не проверяете
23 май 11, 13:29    [10694064]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Да что вы говорите !

create procedure #x as
SET NOCOUNT ON
	
DECLARE @Error INT,@NowDT datetime,@DeliveryDT datetime

SET @Error = 0

SET @Error = -1 

RETURN @Error	
go

declare @ret int
select @ret
exec @ret=#x
select @ret
go 
drop procedure #x
23 май 11, 13:30    [10694076]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Kamenyka
Member

Откуда:
Сообщений: 43
BEGIN
	SET NOCOUNT ON
	
	DECLARE @Error INT
	DECLARE @BillId UNIQUEIDENTIFIER

	SET @Error = 0		
	SET @NowDT = ISNULL(@NowDT, GETDATE())
	
	IF @NowDT > @DeliveryDT BEGIN
		SET @Error = -1 
		ROLLBACK TRAN
		RETURN @Error	
	END
	
	IF @Node IS NULL 	
		BEGIN
			SET @Node=dbo.udf_GEN_GetParam('localnode1', '', '')	
		END
 
	-- удаляем лишние
	DELETE FROM dbo.W_Deliveries
		WHERE WaybillNumber=@WaybillNumber AND ItemNumber<>0

	IF NOT EXISTS(SELECT WaybillNumber 
								FROM dbo.W_Deliveries 
	              WHERE WaybillNumber=@WaybillNumber AND ItemNumber=0)
		BEGIN
			INSERT INTO dbo.W_Deliveries (
				WaybillNumber,
				ItemNumber,
				CourierCode,
				DeliveryDT,
				Consignee,
				EntryUserName,
				EntryDT,
				EntryNode,
				Comment)
			VALUES (
				@WaybillNumber,
				0,
				@CourierCodeInt,
				@DeliveryDT,
				@Consignee,
				@UserName,
				@NowDT,
				@Node,
				@Comment)

			SET @Error = @@ERROR 
			IF @Error != 0 
				BEGIN 
					SET @Error = -100 
					ROLLBACK TRAN
					RETURN @Error
				END
		END
	ELSE
		BEGIN
			-- Отдельно обновляем доставку
			UPDATE dbo.W_Deliveries SET
				CourierCode=@CourierCodeInt,
				DeliveryDT=@DeliveryDT,
				Consignee=@Consignee,
				ChangeUserName=@UserName,
				ChangeDT=@NowDT,
				ChangeNode=@Node,
				Comment=@Comment
			WHERE WaybillNumber=@WaybillNumber AND ItemNumber=0					

			SET @Error = @@ERROR 
			IF @Error != 0 
				BEGIN 
					SET @Error = -100 
					ROLLBACK TRAN
					RETURN @Error
				END
		END
		
	SET @BillId=dbo.udf_B_GetBillId(@WaybillNumber,1)

	IF @BillId IS NOT NULL
		EXEC B_UpdateDeliveryDt @BillId 	
	

	RETURN @Error 	
END

Вот вся процедура тока кое эт оимеет значение! Вопроса всего два как грамотно выдти из процедуры и передать сообщение на клиент!?
23 май 11, 13:34    [10694102]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kamenyka

Вот вся процедура тока кое эт оимеет значение! Вопроса всего два как грамотно выдти из процедуры и передать сообщение на клиент!?

- RETURN
- RAISERROR
23 май 11, 13:36    [10694118]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kamenyka
Вот вся процедура тока кое эт оимеет значение!
Да мы бы так код весь угадали.
Kamenyka
Вопроса всего два как грамотно выдти из процедуры
Грамотно - это "выйти".
Kamenyka
и передать сообщение на клиент!?
Возвращать данные клиенту можно параметрами и наборами данных. Выбирайте.
23 май 11, 13:37    [10694121]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kamenyka,

Ваша процедура, запущенная сама по себе, периодически должна падать с сообщением
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

А Вы что-нибудь про RAISERROR слышали?
23 май 11, 13:39    [10694134]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Kamenyka
Member

Откуда:
Сообщений: 43
Гавриленко Сергей Алексеевич
Kamenyka
Вот вся процедура тока кое эт оимеет значение!
Да мы бы так код весь угадали.
Kamenyka
Вопроса всего два как грамотно выдти из процедуры
Грамотно - это "выйти".
Kamenyka
и передать сообщение на клиент!?
Возвращать данные клиенту можно параметрами и наборами данных. Выбирайте.


Уважаемый Сергей я отлично понимаю что вопрос построен не корректно, ну я и не требовал конкретного ответа, а хотел чтобы меня натолкнули на правильное решение! А вам совет на будущие не надо умничать это человеку не к лицу, не
хотите давать ответ не флудите. И кстати я пришел сюда за помощью а не вам диктант сдавать по русскому языку, а если вам скучно найдите себе хобби!
P.S Лучше не чего не отвечайте, потому что я отвечать вам не собираюсь!

Ответ Glory меня вполне устроил большое спасибо!
23 май 11, 13:55    [10694254]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kamenyka
... ну я и не требовал ... А вам совет на будущие ... не надо умничать ... не флудите ... И кстати я пришел сюда за помощью ... а если вам скучно найдите себе хобби ... Лучше не чего не отвечайте ... не собираюсь!
Не надо учить людей, как им следует жить, и, в частности, как отвечать на форуме. Они в ответ обычно начинают рассказывать, куда вам следует пойти.
23 май 11, 14:03    [10694322]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Kamenyka
BEGIN
	SET NOCOUNT ON
	
	DECLARE @Error INT
	DECLARE @BillId UNIQUEIDENTIFIER

	SET @Error = 0		
	SET @NowDT = ISNULL(@NowDT, GETDATE())
	
	IF @NowDT > @DeliveryDT BEGIN
		SET @Error = -1 
		ROLLBACK TRAN --транзакция не открыта, незачем ее откатывать
		RETURN @Error	
	END
	
	IF @Node IS NULL 	--переменная не объявлена
		BEGIN
			SET @Node=dbo.udf_GEN_GetParam('localnode1', '', '')	
		END
 
	-- удаляем лишние
	DELETE FROM dbo.W_Deliveries
		WHERE WaybillNumber=@WaybillNumber AND ItemNumber<>0  --переменная @WaybillNumber не объявлена и не инициализирована

	IF NOT EXISTS(SELECT WaybillNumber 
								FROM dbo.W_Deliveries 
	              WHERE WaybillNumber=@WaybillNumber AND ItemNumber=0) --та же ошибка
		BEGIN
			INSERT INTO dbo.W_Deliveries (
				WaybillNumber,
				ItemNumber,
				CourierCode,
				DeliveryDT,
				Consignee,
				EntryUserName,
				EntryDT,
				EntryNode,
				Comment)
			VALUES (
				@WaybillNumber,
				0,
				@CourierCodeInt,
				@DeliveryDT,
				@Consignee,
				@UserName,
				@NowDT,
				@Node,
				@Comment) --ни одна из переменных не объявлена и не инициализирована

			SET @Error = @@ERROR 
			IF @Error != 0 
				BEGIN 
					SET @Error = -100 
					ROLLBACK TRAN --транзакция не открыта
					RETURN @Error
				END
		END
	ELSE
		BEGIN
			-- Отдельно обновляем доставку
			UPDATE dbo.W_Deliveries SET
				CourierCode=@CourierCodeInt,
				DeliveryDT=@DeliveryDT,
				Consignee=@Consignee,
				ChangeUserName=@UserName,
				ChangeDT=@NowDT,
				ChangeNode=@Node,
				Comment=@Comment
			WHERE WaybillNumber=@WaybillNumber AND ItemNumber=0		--ни одна из переменных не объявлена и не инициализирована			

			SET @Error = @@ERROR 
			IF @Error != 0 
				BEGIN 
					SET @Error = -100 
					ROLLBACK TRAN --транзакция не открыта
					RETURN @Error
				END
		END
		
	SET @BillId=dbo.udf_B_GetBillId(@WaybillNumber,1)

	IF @BillId IS NOT NULL
		EXEC B_UpdateDeliveryDt @BillId 	
	

	RETURN @Error 	
END

Вот вся процедура тока кое эт оимеет значение! Вопроса всего два как грамотно выдти из процедуры и передать сообщение на клиент!?


Сначала исправь все указанные ошибки.
23 май 11, 18:43    [10696463]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
flexgen,

Да, еще вместо != используй <>
23 май 11, 18:45    [10696469]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Гавриленко Сергей Алексеевич
Member

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

Да, еще вместо != используй <>
Зачем? O_o
23 май 11, 18:47    [10696473]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
а чё так ?
Guest
flexgen
flexgen,

Да, еще вместо != используй <>
23 май 11, 18:48    [10696475]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
flexgen
flexgen,

Да, еще вместо != используй <>


есть разница?
23 май 11, 18:48    [10696476]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Гавриленко Сергей Алексеевич,

Я знаю что обе комбинации легитимны но != это вроде устаревший синтаксис, нет?
23 май 11, 19:30    [10696632]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
flexgen,

Уточнил - это not ISO standard.
23 май 11, 19:35    [10696642]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
flexgen
flexgen,

Уточнил - это not ISO standard.
+1
23 май 11, 20:25    [10696773]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
1
Guest
добавьте в процедуру
SELECT NowDT =@NowDT, DeliveryDT=@DeliveryDT
и все поймете сами
ну и ошибки надо исправить
23 май 11, 20:50    [10696818]     Ответить | Цитировать Сообщить модератору
 Re: Выход из процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
flexgen
Гавриленко Сергей Алексеевич,

Я знаю что обе комбинации легитимны но != это вроде устаревший синтаксис, нет?
Вы путаете с устаревшими outer-join'ами (*= и =*, вот, буквально в соседней ветке 10696313).

Сообщение было отредактировано: 23 май 11, 20:52
23 май 11, 20:50    [10696819]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить