Mam pewien problem - nie wiem czy wstawiam swój wątek w odpowiednią kategorię, czy nie powinien być w Newbie.
Napisałem dwa skrypty - jeden tworzy tabele (tu chyba nie ma problemu) drugi z definicją procedury SQL, której głównym założeniem jest zapisywanie błędów (w moim przypadku powstających przez niezgodność danych typu VARCHAR z INT w tabeli.
Czy możecie coś zasugerować lub podpowiedzieć czy był już taki problem? W załączeniu obydwa skrypty.
Skrypt tablic Tabele.sql
(Tablica1 i Tablica2 - tablice z zapisywanymi danymi, TablicaBlad - tablica do gromadzenia danych o błędach)
use master
use Przechwyt
CREATE TABLE [Tabela1]
( [a][int] NOT NULL )
CREATE TABLE [Tabela2]
( [b][int] NOT NULL )
CREATE TABLE [TabelaBlad]
( [ErrorMessage][NVARCHAR] NOT NULL )
Procedura do zapisywania danych i rejestrowania błędów
USE [Przechwyt]
GO
IF EXISTS (SELECT NAME
FROM SYSOBJECTS
WHERE NAME = N'spPrzechwytywanieDodaj'
AND TYPE = 'P')
DROP PROCEDURE spPrzechwytywanieDodaj
GO
CREATE PROCEDURE spPrzechwytywanieDodaj
--ALTER PROCEDURE spPrzechwytywanieDodaj
--Parametry
@a VARCHAR(10),
@b VARCHAR(10)
AS
BEGIN
begin try
INSERT INTO Tabela1(a) values (@a)
end try
begin catch
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT; -- Nie jestem pewien czy te trzy linie są potrzebne
SELECT
ERROR_NUMBER() AS ErrorNUMBER,
ERROR_SEVERITY() AS ErrorSeverity, -- poziom wywołanego błędu
ERROR_STATE() AS ErrorState, -- numer stanu błędu
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMESSAGE
Insert into TabelaBlad(ErrorMessage) values(@ErrorMessage) --czy to jest dobrze
print ERROR_MESSAGE() -- i to też
end catch
/* PRÓBOWAŁEM TEŻ TAKICH WARUNKÓW
IF @@ERROR = 245
BEGIN
PRINT N'An error occurred deleting the candidate information.';
RETURN 245;
END
ELSE
INSERT INTO Tabela1 values(0)
RETURN 0;
END
*/
begin try
INSERT INTO Tabela2(b) values(@b)
end try
begin catch
SELECT ERROR_MESSAGE() AS ErrorMESSAGE,
ERROR_NUMBER() AS ErrorNUMBER,
ERROR_PROCEDURE() AS ErrorProcedure,
--ERROR_SEVERITY() AS ErrorSeverity,
--ERROR_STATE() AS ErrorState,
ERROR_LINE() AS ErrorLine
end catch
END
GO