CREATE PROCEDURE ZZZ
AS
INSERT INTO XX VALUES(@X, @Y)
GO
to czy trzeba dodawac
np
CREATE PROCEDURE ZZZ
AS
INSERT INTO XX VALUES(@X, @Y)
IF @@ERROR<>0
BEGIN
RAISEERROR 20000 N'AAAA'
END
GO
To chyba nie trzeba bo jak wystapi blad w insertie to i tak nie wykona mojego
raiserrora, czy tak?
sz
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
nie, nie trzeba. Jeżeli insert się nie powiedzie z powodu na przykład
naruszenia klucza obcego błąd podniesie automatycznie engine bazy danych.
Możesz, jak chcesz, zwrócić wartość @@ERROR na zewnątrz procedury, jeżeli
chcesz go jakoś obsługiwać. Raiseerror służy do podnoszenia błędów
użytkownika.
--
pozdrawiam,
Paweł Filipiak
pfil...@poczta.fm; gg 2791867
> severity >=16, chyba). Jeżeli Twoja procedura będzie
> zawierała więcej niż jedną instrukcję i któraś z nich wywoła
> niekrytyczny błąd, to pozostałe wykonają się, chociaż nie
> powinny. Dlatego dobrym zwyczajem jest sprawdzanie
> zmiennej @ERROR i ew. przerywanie kodu.
to prawda. Innym rozwiązaniem problemu opisanego wyżej jest zapięcie bloku
instrukcji w transakcję, przy wcześniejszym wymuszeniu przerywania i
wycofania transakcji w przypadku błędu. Kod będzie wyglądał następująco:
SET XACT_ABORT ON
BEGIN TRAN
INSERT1...
INSERT2...
...
INSERTn...
COMMIT TRAN
SET XACT_ABORT OFF
BooksOnLine mówi, że:
When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time
error, the entire transaction is terminated and rolled back
Jeśli dobrze rozumiem chodzi o każdy runtime-error, bez względu na severity,
czy się mylę?
set xact_abort on
begin tran
select * from cokolwiek
select @@error
rollback
go
select @@trancount
--
Pozdrawiam
Irek