| 

.NET C# Java Javascript Exception

2
Wir haben eine Stored Function für MS SQL Server 2008 oder höher erstellt.
Die Funktion stellt sich wie folgt dar:
CREATE FUNCTION esbNormActivityNumber(@ActivityNumber nvarchar(30))
RETURNS nvarchar (50)
AS
BEGIN
DECLARE @Activity int
DECLARE @Ret nvarchar(50)

SET @Ret = ISNULL(@ActivityNumber, '')
SET @Activity = ABS(CAST(ISNULL(@ActivityNumber, '0') AS int))
IF @@ERROR = 0
BEGIN
SET @Ret = RIGHT('00' + CAST(@Activity AS nvarchar(30)), 3)
END

RETURN @Ret
END
GO

Schlägt die Anweisung SET @Activity fehl (z.B. bei Übergabe einer Zeichenkette, die nicht in einen int gewandelt werden kann), dann erhalte einen Fehler.
Gibt es eine Möglichkeit den Fehler innerhalb der Funktion zu behandeln und damit immer ein gültiges Ergebnis zurückzugeben?
TRY ... CATCH geht leider nicht in Funktionen - was sich Microsoft dabei gedacht hat, ist mir schleierhaft ;-) und meine @@Error-Abfrage kommt offenbar zu spät.
News:
08.07.2013
edvservice 1,2k 6
2 Antworten
1
Du kannst die Eingabe vorher mit der ISNUMERIC-Funktion überprüfen und ggf. behandeln.

CREATE FUNCTION esbNormActivityNumber(@ActivityNumber nvarchar(30))
RETURNS nvarchar (50)
AS
BEGIN
DECLARE @Activity int
DECLARE @Ret nvarchar(50)

if ISNUMERIC(@ActivityNumber) <> 1
return -1

SET @Ret = ISNULL(@ActivityNumber, '')
SET @Activity = ABS(CAST(ISNULL(@ActivityNumber, '0') AS int))
IF @@ERROR = 0
BEGIN
SET @Ret = RIGHT('00' + CAST(@Activity AS nvarchar(30)), 3)
END

RETURN @Ret
END
GO
08.07.2013
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Vielen Dank für den Hinweis. Auf ISNUMERIC() bin ich nicht gekommen; das sollte tatsächlich funktionieren.
edvservice 08.07.2013
1
Aber Achtung: ISNUMERIC() lässt u.U. mehr "durchgehen" als Du möchtest! Für die Funktion gilt z.B. Hex-Notation als absolut ok - es wird also nur geprüft, ob sich der nvarchar-Wert in eine Zahl konvertieren lässt.

Wenn Du nur Ziffern willst, musst Du z.B. mit dem LIKE Operator oder mit PATINDEX.

PATINDEX('%[^0-9]%', @ActivityNumber) = 0

Bart Simpson
08.07.2013
Vielen Dank für den Hinweis. Im Anwendungsfall erscheint mir ISNUMERIC() zunächst ausreichend, da danach sowieso nur ein CAST auf int folgt und von Hexzahlen haben Anwender in der Regel noch etwas gehört.
edvservice 08.07.2013

Stelle deine Sql-server-Frage jetzt!