[SQL] TSQL - 정수 또는 반환 기본값 캐스트 문자열
SQLTSQL - 정수 또는 반환 기본값 캐스트 문자열
int로 및 변환이 실패 할 경우 디폴트 값 또는 NULL을 반환하기 위해 NVARCHAR를 캐스팅 T-SQL의 방법이 있나요?
해결법
-
==============================
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.예 :). 이 시도:
예 :). 이 시도:
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.차라리 당신이 원하는 것을 얻을 수 TryParse 또는 사용 T-SQL TRY-CATCH 블록 같은 함수를 만드는 것입니다.
차라리 당신이 원하는 것을 얻을 수 TryParse 또는 사용 T-SQL TRY-CATCH 블록 같은 함수를 만드는 것입니다.
의도 한대로 ISNUMERIC은 항상 작동하지 않습니다. 당신이 할 경우 이전에 주어진 코드는 실패합니다 :
SET @text = '$'
ISNUMERIC ()가이 경우에 true를 돌려 있도록 $ 기호, 돈 데이터 형식으로 변환 할 수 있습니다. 이 같은 대한을 할 것 '-'(마이너스) ','(쉼표) 및 '.' 자.
-
==============================
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.문안 인사.
문안 인사.
나는 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.요셉의 대답은 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.나는 그것이 매우 아니다 알고 있지만 그것은 간단하다. 이 시도:
나는 그것이 매우 아니다 알고 있지만 그것은 간단하다. 이 시도:
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.이 문제에 대한 내 솔루션은 아래의 기능을 만드는 것이 었습니다. 내 요구 사항은 숫자가 표준 정수가 아닌 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
from https://stackoverflow.com/questions/2000045/tsql-cast-string-to-integer-or-return-default-value by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] GUID의 SCOPE_IDENTITY ()? (0) | 2020.04.10 |
---|---|
[SQL] SQL Server의 고유 식별자에 VARCHAR로 변환 (0) | 2020.04.10 |
[SQL] 두 소수와 다수가 SQL 서버를 배치 쓰기 (0) | 2020.04.10 |
[SQL] SQL 여러 테이블에 LINQ는 외부 조인 왼쪽 (0) | 2020.04.10 |
[SQL] 절은 같은 왼쪽에 일치하지 않는 WHERE 왼쪽이에 조건 가입 할 때 ON에 왜와 가입? [복제] (0) | 2020.04.10 |