Fehler abfangen mit "try ... catch"

01/03/2008 - 20:12 von Matthias Schuppe | Report spam
Hallo zusammen,

ich habe eine SP, die etwa so aussieht (SQL Server 2005):

CREATE PROCEDURE dbo.TabelleINSERT
... Parameter ...
AS
BEGIN
BEGIN TRY
SELECT @Wert = Wert
FROM Verbindungsserver.Datenbank.dbo.Tabelle
END TRY
BEGIN CATCH
SET @Wert = 0
END CATCH
INSERT INTO dbo.Tabelle (
... ...
Wert)
VALUES (
... ...
@Wert)
END

Wenn nun mit dem Zugriff auf den Verbindungsserver etwas schief
làuft, hatte ich gehofft, das durch das "try ... catch" abzufangen,
was aber wohl nicht wirklich funktioniert. Die Prozedur wird
abgebrochen und das "INSERT" wird nicht mehr ausgeführt.

Wie kriegt man so was hin? Es müsste doch möglich sein, diesen
Fehler so abzufangen, dass die Prozedur trotzdem weiter ausgeführt
wird.

Gruß,

Matthias
 

Lesen sie die antworten

#1 Elmar Boye
03/03/2008 - 21:17 | Warnen spam
Hallo Matthias,

Matthias Schuppe schrieb:
ich habe eine SP, die etwa so aussieht (SQL Server 2005):

[... s. u. ...]
Wenn nun mit dem Zugriff auf den Verbindungsserver etwas schief
làuft, hatte ich gehofft, das durch das "try ... catch" abzufangen,
was aber wohl nicht wirklich funktioniert. Die Prozedur wird
abgebrochen und das "INSERT" wird nicht mehr ausgeführt.



Schwere Fehler wie den obigen kann TRY CATCH nicht abfangen.
Aber man kann die Sytem-Prozedur sp_testlinkedserver verwenden,
um vorher auf die Existenz des Linked Servers zu prüfen.

Gruß
Elmar


CREATE PROCEDURE dbo.LinkedServerProc
AS
DECLARE @linkedserver sysname
SET @linkedserver = N'ELMARS'

BEGIN TRAN

BEGIN TRY
EXEC sp_testlinkedserver @linkedserver
END TRY
BEGIN CATCH
RAISERROR (N'Verbindungsserver %s ist nicht verfügbar', 16, 1, @linkedserver)
ROLLBACK;
RETURN;
END CATCH

DECLARE @CompanyName nvarchar(60)
BEGIN TRY
SELECT @CompanyName = CompanyName
FROM ELMARS.Northwind.dbo.Customers
WHERE CustomerID = N'ALFKI'
END TRY
BEGIN CATCH
SET @CompanyName = ''
END CATCH

COMMIT
SELECT @CompanyName
GO

EXEC dbo.LinkedServerProc

Ähnliche fragen