복붙노트

[SQL] TSQL - 정수 또는 반환 기본값 캐스트 문자열

SQL

TSQL - 정수 또는 반환 기본값 캐스트 문자열

int로 및 변환이 실패 할 경우 디폴트 값 또는 NULL을 반환하기 위해 NVARCHAR를 캐스팅 T-SQL의 방법이 있나요?

해결법

  1. ==============================

    1.TRY_CONVERT 기능을 사용하십시오.

    TRY_CONVERT 기능을 사용하십시오.

    사용자 정의 함수를 만듭니다. 이 표도르 하두는 통화, 분수 등 관련하여 언급 된 문제를 방지합니다 :

    CREATE FUNCTION dbo.TryConvertInt(@Value varchar(18))
    RETURNS int
    AS
    BEGIN
        SET @Value = REPLACE(@Value, ',', '')
        IF ISNUMERIC(@Value + 'e0') = 0 RETURN NULL
        IF ( CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0 ) RETURN NULL
        DECLARE @I bigint =
            CASE
            WHEN CHARINDEX('.', @Value) > 0 THEN CONVERT(bigint, PARSENAME(@Value, 2))
            ELSE CONVERT(bigint, @Value)
            END
        IF ABS(@I) > 2147483647 RETURN NULL
        RETURN @I
    END
    GO
    
    -- Testing
    DECLARE @Test TABLE(Value nvarchar(50))    -- Result
    INSERT INTO @Test SELECT '1234'            -- 1234
    INSERT INTO @Test SELECT '1,234'           -- 1234
    INSERT INTO @Test SELECT '1234.0'          -- 1234
    INSERT INTO @Test SELECT '-1234'           -- -1234
    INSERT INTO @Test SELECT '$1234'           -- NULL
    INSERT INTO @Test SELECT '1234e10'         -- NULL
    INSERT INTO @Test SELECT '1234 5678'       -- NULL
    INSERT INTO @Test SELECT '123-456'         -- NULL
    INSERT INTO @Test SELECT '1234.5'          -- NULL
    INSERT INTO @Test SELECT '123456789000000' -- NULL
    INSERT INTO @Test SELECT 'N/A'             -- NULL
    SELECT Value, dbo.TryConvertInt(Value) FROM @Test
    

    참조 : 내 솔루션을 만들 때 내가 광범위하게이 페이지를 사용했다.

  2. ==============================

    2.예 :). 이 시도:

    예 :). 이 시도:

    DECLARE @text AS NVARCHAR(10)
    
    SET @text = '100'
    SELECT CASE WHEN ISNUMERIC(@text) = 1 THEN CAST(@text AS INT) ELSE NULL END
    -- returns 100
    
    SET @text = 'XXX'
    SELECT CASE WHEN ISNUMERIC(@text) = 1 THEN CAST(@text AS INT) ELSE NULL END
    -- returns NULL
    

    ISNUMERIC은 () 표도르 하두 가리키는 몇 가지 문제가 있습니다.

    그것은 $와 같은 문자열 true를 반환하거나 (통화). (모두 분리되어), +와 -.

  3. ==============================

    3.차라리 당신이 원하는 것을 얻을 수 TryParse 또는 사용 T-SQL TRY-CATCH 블록 같은 함수를 만드는 것입니다.

    차라리 당신이 원하는 것을 얻을 수 TryParse 또는 사용 T-SQL TRY-CATCH 블록 같은 함수를 만드는 것입니다.

    의도 한대로 ISNUMERIC은 항상 작동하지 않습니다. 당신이 할 경우 이전에 주어진 코드는 실패합니다 :

    SET @text = '$'

    ISNUMERIC ()가이 경우에 true를 돌려 있도록 $ 기호, 돈 데이터 형식으로 변환 할 수 있습니다. 이 같은 대한을 할 것 '-'(마이너스) ','(쉼표) 및 '.' 자.

  4. ==============================

    4.언급 한 바와 같이 당신이 ISNUMERIC를 사용하는 경우, 당신은 몇 가지 문제로 실행할 수 있습니다 :

    언급 한 바와 같이 당신이 ISNUMERIC를 사용하는 경우, 당신은 몇 가지 문제로 실행할 수 있습니다 :

    -- Incorrectly gives 0:
    SELECT CASE WHEN ISNUMERIC('-') = 1 THEN CAST('-' AS INT) END   
    
    -- Error (conversion failure):
    SELECT CASE WHEN ISNUMERIC('$') = 1 THEN CAST('$' AS INT) END
    SELECT CASE WHEN ISNUMERIC('4.4') = 1 THEN CAST('4.4' AS INT) END
    SELECT CASE WHEN ISNUMERIC('1,300') = 1 THEN CAST('1,300' AS INT) END
    
    -- Error (overflow):
    SELECT CASE WHEN ISNUMERIC('9999999999') = 1 THEN CAST('9999999999' AS INT) END
    

    당신이 신뢰할 수있는 변환을 원하는 경우에, 당신은 코드 하나 자신에게해야합니다.

    업데이트 : 내 새로운 추천 수를 확인하기 FLOAT에 중간 시험 전환을 사용하는 것입니다. 이 접근법은 adrianm의 의견을 기반으로합니다. 논리는 인라인 테이블 반환 함수로 정의 할 수 있습니다 :

    CREATE FUNCTION TryConvertInt (@text NVARCHAR(MAX)) 
    RETURNS TABLE
    AS
    RETURN
    (
        SELECT
            CASE WHEN ISNUMERIC(@text + '.e0') = 1 THEN 
                 CASE WHEN CONVERT(FLOAT, @text) BETWEEN -2147483648 AND 2147483647 
                      THEN CONVERT(INT, @text) 
                 END 
             END AS [Result]
    )
    

    일부 테스트 :

    SELECT [Conversion].[Result]
    FROM ( VALUES
         ( '1234'                     )   -- 1234
       , ( '1,234'                    )   -- NULL
       , ( '1234.0'                   )   -- NULL
       , ( '-1234'                    )   -- -1234
       , ( '$1234'                    )   -- NULL
       , ( '1234e10'                  )   -- NULL
       , ( '1234 5678'                )   -- NULL
       , ( '123-456'                  )   -- NULL
       , ( '1234.5'                   )   -- NULL
       , ( '123456789000000'          )   -- NULL
       , ( 'N/A'                      )   -- NULL
       , ( '-'                        )   -- NULL
       , ( '$'                        )   -- NULL
       , ( '4.4'                      )   -- NULL
       , ( '1,300'                    )   -- NULL
       , ( '9999999999'               )   -- NULL
       , ( '00000000000000001234'     )   -- 1234
       , ( '212110090000000235698741' )   -- NULL
    ) AS [Source] ([Text])
    OUTER APPLY TryConvertInt ([Source].[Text]) AS [Conversion]
    

    결과는 다음과 같은 주요 차이점 조셉 Sturtevant의 대답과 비슷합니다 :

    철회 : 단지 참조를 위해 남아으로 아래의 접근 방식은 더 이상 좋습니다.

    은 음이 아닌 정수에 작품 아래 니펫을. 이 검사는 문자열이 아닌 숫자 문자를 포함하지 않는, 비어 있지 않은, 그리고합니다 (INT 타입의 최대 값을 초과하여)하지 오버 플로우 않습니다. 그러나, 그것은 또한 그 길이 때문에 앞에 0이 10자를 초과하는 유효 정수에 대한 NULL을 제공합니다.

    SELECT 
        CASE WHEN @text NOT LIKE '%[^0-9]%' THEN
             CASE WHEN LEN(@text) BETWEEN 1 AND 9 
                    OR LEN(@text) = 10 AND @text <= '2147483647' 
                  THEN CAST (@text AS INT)
             END
        END 
    

    당신이 앞에 오는 0의 수를 지원하려면, 아래를 사용합니다. 중첩 CASE 문은 다루기이라도 단락 평가를 촉진 (왼쪽 음 길이를 통과하는, 예를 들면, 발생하는) 에러의 가능성을 줄이기 위해 필요하다.

    SELECT 
        CASE WHEN @text NOT LIKE '%[^0-9]%' THEN
             CASE WHEN LEN(@text) BETWEEN 1 AND 9 THEN CAST (@text AS INT)
                  WHEN LEN(@text) >= 10 THEN
                  CASE WHEN LEFT(@text, LEN(@text) - 10) NOT LIKE '%[^0]%'
                        AND RIGHT(@text, 10) <= '2147483647'
                       THEN CAST (@text AS INT)
                  END
             END
        END
    

    당신은 앞에 오는 0의 수와 양 및 음의 정수를 지원하려면 :

    SELECT 
             -- Positive integers (or 0):
        CASE WHEN @text NOT LIKE '%[^0-9]%' THEN
             CASE WHEN LEN(@text) BETWEEN 1 AND 9 THEN CAST (@text AS INT)
                  WHEN LEN(@text) >= 10 THEN
                  CASE WHEN LEFT(@text, LEN(@text) - 10) NOT LIKE '%[^0]%'
                        AND RIGHT(@text, 10) <= '2147483647'
                       THEN CAST (@text AS INT)
                  END
             END
             -- Negative integers:
             WHEN LEFT(@text, 1) = '-' THEN
             CASE WHEN RIGHT(@text, LEN(@text) - 1) NOT LIKE '%[^0-9]%' THEN
                  CASE WHEN LEN(@text) BETWEEN 2 AND 10 THEN CAST (@text AS INT)
                       WHEN LEN(@text) >= 11 THEN
                       CASE WHEN SUBSTRING(@text, 2, LEN(@text) - 11) NOT LIKE '%[^0]%'
                             AND RIGHT(@text, 10) <= '2147483648'
                            THEN CAST (@text AS INT)
                       END
                  END
             END
        END
    
  5. ==============================

    5.문안 인사.

    문안 인사.

    나는 SQL Server 2008의 SQL 서버 2012의 TRY_CAST 기능을 시뮬레이션 할 수있는 유용한 스칼라 함수를 썼다.

    당신은 아래의 다음 링크에서 볼 수 있으며, 우리는 그것을 개선하기 위해 서로 도움이됩니다. SQL Server에 대한 TRY_CAST 기능 2008 https://gist.github.com/jotapardo/800881eba8c5072eb8d99ce6eb74c8bb

    dbo.TRY_CAST(Expression, Data_Type, ReturnValueIfErrorCast)
    

    예:

    SELECT   CASE WHEN dbo.TRY_CAST('6666666166666212', 'INT', DEFAULT) IS NULL   
                            THEN 'Cast failed'  
                            ELSE 'Cast succeeded'  
                        END AS Result; 
    

    이제 데이터 유형 INT를 지원하는 경우, 날짜, 숫자, BIT 및 FLOAT

    나는 당신이 도움이되기를 바랍니다.

    암호:

    DECLARE @strSQL NVARCHAR(1000)
    IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TRY_CAST]'))
        BEGIN
            SET @strSQL = 'CREATE FUNCTION [dbo].[TRY_CAST] () RETURNS INT AS BEGIN RETURN 0 END'
            EXEC sys.sp_executesql @strSQL
        END
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    /*
    ------------------------------------------------------------------------------------------------------------------------
        Description:    
                        Syntax 
                        ---------------
                        dbo.TRY_CAST(Expression, Data_Type, ReturnValueIfErrorCast)
    
                        +---------------------------+-----------------------+
                        |   Expression              |   VARCHAR(8000)       |
                        +---------------------------+-----------------------+
                        |   Data_Type               |   VARCHAR(8000)       |
                        +---------------------------+-----------------------+
                        |   ReturnValueIfErrorCast  |   SQL_VARIANT = NULL  |
                        +---------------------------+-----------------------+
    
    
                        Arguments
                        ---------------
                        expression
                        The value to be cast. Any valid expression.
    
                        Data_Type
                        The data type into which to cast expression.
    
                        ReturnValueIfErrorCast
                        Value returned if cast fails or is not supported. Required. Set the DEFAULT value by default.
    
    
                        Return Type
                        ----------------
                        Returns value cast to SQL_VARIANT type if the cast succeeds; otherwise, returns null if the parameter @pReturnValueIfErrorCast is set to DEFAULT, 
                        or that the user indicates.
    
    
                        Remarks
                        ----------------
                        dbo.TRY_CAST function simulates the TRY_CAST function reserved of SQL SERVER 2012 for using in SQL SERVER 2008. 
                        dbo.TRY_CAST function takes the value passed to it and tries to convert it to the specified Data_Type. 
                        If the cast succeeds, dbo.TRY_CAST returns the value as SQL_VARIANT type; if the cast doesn´t succees, null is returned if the parameter @pReturnValueIfErrorCast is set to DEFAULT. 
                        If the Data_Type is unsupported will return @pReturnValueIfErrorCast.
                        dbo.TRY_CAST function requires user make an explicit CAST or CONVERT in ANY statements.
                        This version of dbo.TRY_CAST only supports CAST for INT, DATE, NUMERIC and BIT types.
    
    
                        Examples
                        ====================================================================================================
    
                        --A. Test TRY_CAST function returns null
    
                            SELECT   
                                CASE WHEN dbo.TRY_CAST('6666666166666212', 'INT', DEFAULT) IS NULL   
                                THEN 'Cast failed'  
                                ELSE 'Cast succeeded'  
                            END AS Result; 
    
                        GO
    
                        --B. Error Cast With User Value
    
                            SELECT   
                                dbo.TRY_CAST('2147483648', 'INT', DEFAULT) AS [Error Cast With DEFAULT],
                                dbo.TRY_CAST('2147483648', 'INT', -1) AS [Error Cast With User Value],
                                dbo.TRY_CAST('2147483648', 'INT', NULL) AS [Error Cast With User NULL Value]; 
    
                            GO 
    
                        --C. Additional CAST or CONVERT required in any assignment statement
    
                            DECLARE @IntegerVariable AS INT
    
                            SET @IntegerVariable = CAST(dbo.TRY_CAST(123, 'INT', DEFAULT) AS INT)
    
                            SELECT @IntegerVariable
    
                            GO 
    
                            IF OBJECT_ID('tempdb..#temp') IS NOT NULL
                                DROP TABLE #temp
    
                            CREATE TABLE #temp (
                                Id INT IDENTITY
                                , FieldNumeric NUMERIC(3, 1)
                                )
    
                            INSERT INTO dbo.#temp (FieldNumeric)
                            SELECT CAST(dbo.TRY_CAST(12.3, 'NUMERIC(3,1)', 0) AS NUMERIC(3, 1));--Need explicit CAST on INSERT statements
    
                            SELECT *
                            FROM #temp
    
                            DROP TABLE #temp
    
                            GO 
    
                        --D. Supports CAST for INT, DATE, NUMERIC and BIT types.
    
                            SELECT dbo.TRY_CAST(2147483648, 'INT', 0) AS [Cast failed]
                                , dbo.TRY_CAST(2147483647, 'INT', 0) AS [Cast succeeded]
                                , SQL_VARIANT_PROPERTY(dbo.TRY_CAST(212, 'INT', 0), 'BaseType') AS [BaseType];
    
                            SELECT dbo.TRY_CAST('AAAA0101', 'DATE', DEFAULT) AS [Cast failed]
                                , dbo.TRY_CAST('20160101', 'DATE', DEFAULT) AS [Cast succeeded]
                                , SQL_VARIANT_PROPERTY(dbo.TRY_CAST('2016-01-01', 'DATE', DEFAULT), 'BaseType') AS [BaseType];
    
                            SELECT dbo.TRY_CAST(1.23, 'NUMERIC(3,1)', DEFAULT) AS [Cast failed]
                                , dbo.TRY_CAST(12.3, 'NUMERIC(3,1)', DEFAULT) AS [Cast succeeded]
                                , SQL_VARIANT_PROPERTY(dbo.TRY_CAST(12.3, 'NUMERIC(3,1)', DEFAULT), 'BaseType') AS [BaseType];
    
                            SELECT dbo.TRY_CAST('A', 'BIT', DEFAULT) AS [Cast failed]
                                , dbo.TRY_CAST(1, 'BIT', DEFAULT) AS [Cast succeeded]
                                , SQL_VARIANT_PROPERTY(dbo.TRY_CAST('123', 'BIT', DEFAULT), 'BaseType') AS [BaseType];
    
                            GO 
    
                        --E. B. TRY_CAST return NULL on unsupported data_types
    
                            SELECT dbo.TRY_CAST(4, 'xml', DEFAULT) AS [unsupported];  
    
                            GO  
    
                        ====================================================================================================
    
    ------------------------------------------------------------------------------------------------------------------------
        Responsible:    Javier Pardo 
        Date:           diciembre 29/2016
        WB tests:       Javier Pardo 
    ------------------------------------------------------------------------------------------------------------------------
        Update by:      Javier Eduardo Pardo Moreno 
        Date:           febrero 16/2017
        Id update:      JEPM20170216
        Description:    Fix  ISNUMERIC function makes it unreliable. SELECT dbo.TRY_CAST('+', 'INT', 0) will yield Msg 8114, 
                        Level 16, State 5, Line 16 Error converting data type varchar to float.
                        ISNUMERIC() function treats few more characters as numeric, like: – (minus), + (plus), $ (dollar), \ (back slash), (.)dot and (,)comma
                        Collaborator aperiooculus (http://stackoverflow.com/users/3083382/aperiooculus )
    
                        Fix dbo.TRY_CAST('2013/09/20', 'datetime', DEFAULT) for supporting DATETIME format
    
        WB tests:       Javier Pardo 
    
    ------------------------------------------------------------------------------------------------------------------------
    */
    
    ALTER FUNCTION dbo.TRY_CAST
    (
        @pExpression AS VARCHAR(8000),
        @pData_Type AS VARCHAR(8000),
        @pReturnValueIfErrorCast AS SQL_VARIANT = NULL
    )
    RETURNS SQL_VARIANT
    AS
    BEGIN
        --------------------------------------------------------------------------------
        --  INT 
        --------------------------------------------------------------------------------
    
        IF @pData_Type = 'INT'
        BEGIN
            IF ISNUMERIC(@pExpression) = 1 AND @pExpression NOT IN ('-','+','$','.',',','\')    --JEPM20170216
            BEGIN
                DECLARE @pExpressionINT AS FLOAT = CAST(@pExpression AS FLOAT)
    
                IF @pExpressionINT BETWEEN - 2147483648.0 AND 2147483647.0
                BEGIN
                    RETURN CAST(@pExpressionINT as INT)
                END
                ELSE
                BEGIN
                    RETURN @pReturnValueIfErrorCast
                END --FIN IF @pExpressionINT BETWEEN - 2147483648.0 AND 2147483647.0
            END
            ELSE
            BEGIN
                RETURN @pReturnValueIfErrorCast
            END -- FIN IF ISNUMERIC(@pExpression) = 1
        END -- FIN IF @pData_Type = 'INT'
    
        --------------------------------------------------------------------------------
        --  DATE    
        --------------------------------------------------------------------------------
    
        IF @pData_Type IN ('DATE','DATETIME')
        BEGIN
            IF ISDATE(@pExpression) = 1
            BEGIN
    
                DECLARE @pExpressionDATE AS DATETIME = cast(@pExpression AS DATETIME)
    
                IF @pData_Type = 'DATE'
                BEGIN
                    RETURN cast(@pExpressionDATE as DATE)
                END
    
                IF @pData_Type = 'DATETIME'
                BEGIN
                    RETURN cast(@pExpressionDATE as DATETIME)
                END
    
            END
            ELSE 
            BEGIN
    
                DECLARE @pExpressionDATEReplaced AS VARCHAR(50) = REPLACE(REPLACE(REPLACE(@pExpression,'\',''),'/',''),'-','')
    
                IF ISDATE(@pExpressionDATEReplaced) = 1
                BEGIN
                    IF @pData_Type = 'DATE'
                    BEGIN
                        RETURN cast(@pExpressionDATEReplaced as DATE)
                    END
    
                    IF @pData_Type = 'DATETIME'
                    BEGIN
                        RETURN cast(@pExpressionDATEReplaced as DATETIME)
                    END
    
                END
                ELSE
                BEGIN
                    RETURN @pReturnValueIfErrorCast
                END
            END --FIN IF ISDATE(@pExpression) = 1
        END --FIN IF @pData_Type = 'DATE'
    
        --------------------------------------------------------------------------------
        --  NUMERIC 
        --------------------------------------------------------------------------------
    
        IF @pData_Type LIKE 'NUMERIC%'
        BEGIN
    
            IF ISNUMERIC(@pExpression) = 1
            BEGIN
    
                DECLARE @TotalDigitsOfType AS INT = SUBSTRING(@pData_Type,CHARINDEX('(',@pData_Type)+1,  CHARINDEX(',',@pData_Type) - CHARINDEX('(',@pData_Type) - 1)
                    , @TotalDecimalsOfType AS INT = SUBSTRING(@pData_Type,CHARINDEX(',',@pData_Type)+1,  CHARINDEX(')',@pData_Type) - CHARINDEX(',',@pData_Type) - 1)
                    , @TotalDigitsOfValue AS INT 
                    , @TotalDecimalsOfValue AS INT 
                    , @TotalWholeDigitsOfType AS INT 
                    , @TotalWholeDigitsOfValue AS INT 
    
                SET @pExpression = REPLACE(@pExpression, ',','.')
    
                SET @TotalDigitsOfValue = LEN(REPLACE(@pExpression, '.',''))
                SET @TotalDecimalsOfValue = CASE Charindex('.', @pExpression)
                                            WHEN 0
                                                THEN 0
                                            ELSE Len(Cast(Cast(Reverse(CONVERT(VARCHAR(50), @pExpression, 128)) AS FLOAT) AS BIGINT))
                                            END 
                SET @TotalWholeDigitsOfType = @TotalDigitsOfType - @TotalDecimalsOfType
                SET @TotalWholeDigitsOfValue = @TotalDigitsOfValue - @TotalDecimalsOfValue
    
                -- The total digits can not be greater than the p part of NUMERIC (p, s)
                -- The total of decimals can not be greater than the part s of NUMERIC (p, s)
                -- The total digits of the whole part can not be greater than the subtraction between p and s
                IF (@TotalDigitsOfValue <= @TotalDigitsOfType) AND (@TotalDecimalsOfValue <= @TotalDecimalsOfType) AND (@TotalWholeDigitsOfValue <= @TotalWholeDigitsOfType)
                BEGIN
                    DECLARE @pExpressionNUMERIC AS FLOAT
                    SET @pExpressionNUMERIC = CAST (ROUND(@pExpression, @TotalDecimalsOfValue) AS FLOAT) 
    
                    RETURN @pExpressionNUMERIC --Returns type FLOAT
                END 
                else
                BEGIN
                    RETURN @pReturnValueIfErrorCast
                END-- FIN IF (@TotalDigitisOfValue <= @TotalDigits) AND (@TotalDecimalsOfValue <= @TotalDecimals) 
    
            END
            ELSE 
            BEGIN
                RETURN @pReturnValueIfErrorCast
            END --FIN IF ISNUMERIC(@pExpression) = 1
        END --IF @pData_Type LIKE 'NUMERIC%'
    
        --------------------------------------------------------------------------------
        --  BIT 
        --------------------------------------------------------------------------------
    
        IF @pData_Type LIKE 'BIT'
        BEGIN
            IF ISNUMERIC(@pExpression) = 1
            BEGIN
                RETURN CAST(@pExpression AS BIT) 
            END
            ELSE 
            BEGIN
                RETURN @pReturnValueIfErrorCast
            END --FIN IF ISNUMERIC(@pExpression) = 1
        END --IF @pData_Type LIKE 'BIT'
    
    
        --------------------------------------------------------------------------------
        --  FLOAT   
        --------------------------------------------------------------------------------
    
        IF @pData_Type LIKE 'FLOAT'
        BEGIN
            IF ISNUMERIC(REPLACE(REPLACE(@pExpression, CHAR(13), ''), CHAR(10), '')) = 1
            BEGIN
    
                RETURN CAST(@pExpression AS FLOAT) 
            END
            ELSE 
            BEGIN
    
                IF REPLACE(@pExpression, CHAR(13), '') = '' --Only white spaces are replaced, not new lines
                BEGIN
                    RETURN 0
                END
                ELSE 
                BEGIN
                    RETURN @pReturnValueIfErrorCast
                END --IF REPLACE(@pExpression, CHAR(13), '') = '' 
    
            END --FIN IF ISNUMERIC(@pExpression) = 1
        END --IF @pData_Type LIKE 'FLOAT'
    
        --------------------------------------------------------------------------------
        --  Any other unsupported data type will return NULL or the value assigned by the user to @pReturnValueIfErrorCast  
        --------------------------------------------------------------------------------
    
        RETURN @pReturnValueIfErrorCast
    
    
    
    END
    
  6. ==============================

    6.요셉의 대답은 ISNUMERIC도 '1.3E + 3'과 같은 과학적 표기법을 처리하지만 그의 대답은 숫자의 형식을 처리하지 않습니다 지적했다.

    요셉의 대답은 ISNUMERIC도 '1.3E + 3'과 같은 과학적 표기법을 처리하지만 그의 대답은 숫자의 형식을 처리하지 않습니다 지적했다.

    돈 또는 부동 소수점 첫째 손잡이 모두 통화 및 과학 문제에 캐스팅 :

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TryConvertInt]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    DROP FUNCTION [dbo].[TryConvertInt]
    GO
    
    CREATE FUNCTION dbo.TryConvertInt(@Value varchar(18))
    RETURNS bigint
    AS
    BEGIN
        DECLARE @IntValue bigint;
    
        IF (ISNUMERIC(@Value) = 1)
            IF (@Value like '%e%')
                SET @IntValue = CAST(Cast(@Value as float) as bigint);
            ELSE
                SET @IntValue = CAST(CAST(@Value as money) as bigint);
        ELSE
            SET @IntValue = NULL;
    
        RETURN @IntValue;
    END
    

    수가 BIGINT보다 큰 경우 함수는 실패합니다.

    다른 기본 값을 반환하려는 경우가 일반적이기 때문에이 기능을 중단하고 나중에 널 (null)을 대체 :

    SELECT IsNull(dbo.TryConvertInt('nan') , 1000);
    
  7. ==============================

    7.나는 그것이 매우 아니다 알고 있지만 그것은 간단하다. 이 시도:

    나는 그것이 매우 아니다 알고 있지만 그것은 간단하다. 이 시도:

    declare @AlpaNumber nvarchar(50) = 'ABC'
    declare @MyNumber int = 0
    begin Try
    select @MyNumber = case when ISNUMERIC(@AlpaNumber) = 1 then cast(@AlpaNumber as int) else 0 end
    End Try
    Begin Catch
        -- Do nothing
    End Catch 
    
    if exists(select * from mytable where mynumber = @MyNumber)
    Begin
    print 'Found'
    End
    Else
    Begin
     print 'Not Found'
    End
    
  8. ==============================

    8.이 문제에 대한 내 솔루션은 아래의 기능을 만드는 것이 었습니다. 내 요구 사항은 숫자가 표준 정수가 아닌 BIGINT해야했다, 나는 음수와 양수를 허용해야한다는 포함되어 있습니다. 이 실패는 어디에서 상황을 발견하지 않았습니다.

    이 문제에 대한 내 솔루션은 아래의 기능을 만드는 것이 었습니다. 내 요구 사항은 숫자가 표준 정수가 아닌 BIGINT해야했다, 나는 음수와 양수를 허용해야한다는 포함되어 있습니다. 이 실패는 어디에서 상황을 발견하지 않았습니다.

    CREATE FUNCTION [dbo].[udfIsInteger]
    (
        -- Add the parameters for the function here
        @Value nvarchar(max)
    )
    RETURNS int
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @Result int = 0
    
        -- Add the T-SQL statements to compute the return value here
        DECLARE @MinValue nvarchar(11) = '-2147483648'
        DECLARE @MaxValue nvarchar(10) = '2147483647'
    
        SET @Value = ISNULL(@Value,'')
    
        IF LEN(@Value)=0 OR 
          ISNUMERIC(@Value)<>1 OR
          (LEFT(@Value,1)='-' AND LEN(@Value)>11) OR
          (LEFT(@Value,1)='-' AND LEN(@Value)=11 AND @Value>@MinValue) OR
          (LEFT(@Value,1)<>'-' AND LEN(@Value)>10) OR
          (LEFT(@Value,1)<>'-' AND LEN(@Value)=10 AND @Value>@MaxValue)
          GOTO FINISHED
    
        DECLARE @cnt int = 0
        WHILE @cnt<LEN(@Value)
        BEGIN
          SET @cnt=@cnt+1
          IF SUBSTRING(@Value,@cnt,1) NOT IN ('-','0','1','2','3','4','5','6','7','8','9') GOTO FINISHED
        END
        SET @Result=1
    
    FINISHED:
        -- Return the result of the function
        RETURN @Result
    
    END
    
  9. from https://stackoverflow.com/questions/2000045/tsql-cast-string-to-integer-or-return-default-value by cc-by-sa and MIT license