2017-05-10 80 views
2

你好我有一個函數,並介紹一個變量,它會帶來一個字母或數字,如果該變量是一個字母,它需要導致錯誤並返回0,或者如果是一個數然後返回1.T-SQL函數拋出錯誤

SO在T-SQL我有一個過程,最終將調用此函數來檢查是是一個數字:

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

可變@sTxpX被保持的值是' T',所以我知道它需要從函數返回0,因爲無效是一個數字,但我沒有得到正確的函數來構建它,我會很感激這裏的一些幫助。

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; 

回答

2

試試這個功能:

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

謝謝你,這是我需要的。 –

3

爲什麼不能使用內置的SQL函數?它速度更快,並且不需要讓自己變得瘋狂以提出解決方案。

在你的程序中執行以下操作:

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 

您可以在以後通過@isNumber變量返回給用戶的時間。

+0

但IsNumeric函數是一個幾乎無用的功能。考慮像「1e4」這樣的值。這看起來不像一個數字,但會從IsNumeric返回1。或者其他有趣的字符串,比如「$」。 –

+0

@SeanLange在技術上,1e4是一個有效的數字,因此它將返回爲TRUE。從OP看來,傳入的變量似乎是單個字符的字母數字字符,因此我的解決方案將起作用。你真的認爲ISNUMERIC函數中的這些缺點真的使它無用嗎?我覺得這個標籤有點苛刻。 – Eli

+1

也許如果它被命名爲ValueCanBeConvertedToAnyDatatypeThatIsVaguelyLikeANumber,那會更好。 :)不打折你的答案,我打折了IsNumeric函數。 –