2017-05-10 3 views
2

Hallo dort habe ich eine Funktion und ist Einführung eine Variable, die einen Buchstaben oder eine Zahl bringt, wenn die Variable ein Buchstabe ist, muss es einen Fehler verursachen und eine 0 zurückgeben, oder wenn ist eine Zahl dann 1.T-SQL-Funktion, Fehler zu werfen

SO in T-SQL kehre ich eine Prozedur, die schließlich überprüfen Sie diese Funktion aufrufen, ist eine Zahl:

IF dbo.VALIDNUMBER(@sTxpX) != 0 AND @sTxpX IS NOT NULL 

Die Variable @sTxpX Wert hält, der ist ' T 'also weiß ich, dass es 0 von der Funktion zurückgeben muss, weil es ungültig ist, um eine Zahl zu sein, aber ich bekomme nicht die richtige Funktion, es zu bauen, ich werde etwas Hilfe hier schätzen.

CREATE FUNCTION DBO.VALIDNUMBER (@sTextStr VARCHAR(4000)) RETURNS BIT AS 
BEGIN 
DECLARE @bValidNumberStr BIT = 1; DECLARE @nTest BIGINT; 

    SET @nTest = CAST(@sTextStr AS numeric(38, 10)) + 1; 
    RETURN @bValidNumberStr; 

EXCEPTION 
    WHEN OTHERS THEN 
     SET @bValidNumberStr = 0; 
    RETURN @bValidNumberStr; 
END; 

Antwort

2

Versuchen Sie, diese Funktion:

CREATE function [dbo].[VALIDNUMBER] 
(@strText VARCHAR(4000)) 
RETURNS BIT 
AS 
BEGIN 
DECLARE @Return as bit 
IF TRY_CAST(@strText AS NUMERIC(38,10)) IS NOT NULL BEGIN 
    SET @Return = 1 
END ELSE BEGIN 
    SET @Return = 0 
END 

RETURN @Return 

END 
+0

Vielen Dank das, was ich brauchte. –

3

Warum können Sie die integrierte SQL-Funktion nicht verwenden? Es ist schneller und du musst dich nicht selbst verrückt machen, um eine Lösung zu finden.

In Ihrem Verfahren Sie wie folgt vor:

DECLARE @isNumber bit; 

IF (ISNUMERIC(@sTextStr) = 1) 
    BEGIN 
     SET @isNumber = 1 
    END 
ELSE 
    BEGIN 
     SET @isNumber = 0 

     RAISERROR(15600, 16, 20, 'That was not a number') 
    END 

Sie die @IsNumber Variable zu einem späteren Zeitpunkt an den Benutzer weitergeben können zurück.

+0

Aber IsNumeric ist eine nahezu nutzlos Funktion. Betrachte Werte wie "1e4". Das sieht nicht wie eine Zahl aus, sondern gibt 1 von IsNumeric zurück. Oder andere interessante Strings wie "$." –

+0

@SeanLange technisch, 1e4 ist eine gültige Zahl, daher wird es als TRUE zurückgeben. Aus dem OP scheint es so zu sein, dass die übergebene Variable ein einzelnes alphanumerisches Zeichen wäre, daher würde meine Lösung funktionieren. Glauben Sie wirklich, dass diese Mängel in der ISNUMERIC-Funktion es wirklich nutzlos machen? Ich hatte das Gefühl, dass diese Kennzeichnung etwas hart war. – Eli

+1

Vielleicht wäre es besser, wenn es so etwas wie ValueCanBeConvertedToAnyDatatypeThatIsVagueelyLikeANumber heißt. :) Ich habe Ihre Antwort nicht diskontiert, ich habe die IsNumeric-Funktion diskontiert. –