Witam Piszę procedurę przechowywaną, która będzie wykonywała partię zadań w harmonogramie godzinowym i próbuję zdecydować, czy zwrócić błędy lub je podnieść. Zakładając, że rejestrowałbym błędy w każdym zadaniu, które prowadziłyby do lepszej wydajności i łatwości konserwacji?t-sql Powrót Kody błędów vs RaiseError
np.
-with kody błędu
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RETURN 1; --Return 1 for error
END CATCH
RETURN 0;
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION;
DECLARE @Error INT;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN;
ErrorHandling:
IF @@TRANCOUNT > 0
ROLLBACK;
END
np RaiseError
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE());
END CATCH
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
EXEC Job1;
EXEC Job1;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
Ten ostatni wydaje się produkować kod bardziej linkujących
* "... ponieważ procedury składowane mogą zwracać NULL" * - ta instrukcja wydaje się być niepoprawna. Sądząc po podręczniku [SQL Server 2000 RETURN] (http://msdn.microsoft.com/en-us/library/aa238375%28v=sql.80%29.aspx), a także w [SQL Server 2012 jeden ] (http://msdn.microsoft.com/en-us/library/ms174998%28v=sql.110%29.aspx), procedur przechowywanych w SQL Server nie można zwrócić NULL. –
To jest rzeczywiście niepoprawne. Wypróbowałem to (SQL Server 2012) i otrzymałem: Procedura "ReturnNullTest" próbowała zwrócić status NULL, co nie jest dozwolone. Zamiast tego zostanie zwrócony status 0. Pozostała odpowiedź jest jednak bardzo pomocna. – Davos
@ Davos. . . Frazowanie jest nieeleganckie. Procedury przechowywane nie zwracają 'NULL', ale jeśli procedura składowana nie powiedzie się, zwracana wartość wykryta przez wywołującego to' NULL'. Lub, jeśli procedura składowana nie ma instrukcji "return". –