টি-এসকিউএল-তে কোনও উপায় আছে যদি কোনও রূপান্তর ব্যর্থ হয় তবে কোনও ডিফল্ট মান বা NULL ফেরার জন্য কোনও এনভারচারকে castালতে পারে?
টি-এসকিউএল-তে কোনও উপায় আছে যদি কোনও রূপান্তর ব্যর্থ হয় তবে কোনও ডিফল্ট মান বা NULL ফেরার জন্য কোনও এনভারচারকে castালতে পারে?
উত্তর:
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
তথ্যসূত্র: আমার সমাধান তৈরি করার সময় আমি এই পৃষ্ঠাটি ব্যাপকভাবে ব্যবহার করেছি।
হ্যাঁ :). এটা চেষ্টা কর:
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()
ফেডার হাজদু দ্বারা চিহ্নিত কয়েকটি সমস্যা রয়েছে ।
এটি $
(যেমন মুদ্রা), ,
বা .
(উভয় বিভাজক) +
এবং এর মতো স্ট্রিংয়ের জন্য সত্য ফিরে আসে -
।
ISNUMERIC
এই উত্তরটির জন্য অবৈধ ডেটা ব্যবহারের জন্য অনেকগুলি সমস্যা রয়েছে (এবং ISNUMERIC
সঠিকভাবে যাচাই করা ডেটার জন্য আপনার প্রথমে চেকের প্রয়োজন হবে না )। লেখক এই বিষয়গুলির অস্তিত্ব স্বীকার করেছেন তবে সেগুলি সমাধান করেন না।
TRY_CONVERT
/ ব্যবহার করা উচিত TRY_CAST
, যা স্পষ্টভাবে ওপির প্রশ্নটি সমাধান করার উদ্দেশ্যে are এসকিউএল 2012 প্রকাশের আগে এই উত্তরটি লেখা হয়েছিল।
আমি বরং ট্রাই পার্সির মতো একটি ফাংশন তৈরি করব বা TRY-CATCH
আপনি যা চেয়েছিলেন তা পেতে টি-এসকিউএল ব্লক ব্যবহার করুন ।
ISNUMERIC সবসময় ইচ্ছা মতো কাজ করে না। আগে দেওয়া কোডটি ব্যর্থ হবে যদি আপনি তা করেন:
SEte @text = '$'
$ চিহ্নটি মানি ডেটাটাইপে রূপান্তরিত হতে পারে, সুতরাং ISNUMERIC()
সেই ক্ষেত্রে সত্য ফিরে আসে। এটি '-' (বিয়োগ), ',' (কমা) এবং 'এর জন্য একই কাজ করবে। চরিত্র.
ISNUMERIC()
আয় 1
এছাড়াও ,
এবং .
।
যেমনটি উল্লেখ করা হয়েছে, আপনি যদি কিছু ব্যবহার করেন তবে আপনি বেশ কয়েকটি সমস্যার সমাধান করতে পারেন 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
হ'ল নম্বরটি বৈধ করার জন্য মধ্যস্থতাকারী পরীক্ষা রূপান্তরটি ব্যবহার করা । এই পদ্ধতির অ্যাড্রিয়ানামের মন্তব্যের উপর ভিত্তি করে । যুক্তিটি একটি ইনলাইন টেবিলের মূল্যবান ফাংশন হিসাবে সংজ্ঞায়িত করা যেতে পারে:
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]
নিম্নলিখিত প্রধান পার্থক্য সহ ফলাফল জোসেফ স্টুর্তেভেন্টের জবাবের মতো :
.
বা ঘটনাকে সহ্য করে না । এবং ফিরে ।,
INT
'1,234'
'1234.0'
NULL
'00000000000000001234'
মূল্যায়ন 12
। পরামিতি দৈর্ঘ্য বৃদ্ধি সংখ্যার ত্রুটিগুলি স্থাপিত হবে যে ওভারফ্লো BIGINT
যেমন BBANs (মৌলিক ব্যাঙ্ক অ্যাকাউন্ট নম্বর) মত '212110090000000235698741'
।প্রত্যাহার : নীচের পদ্ধতির আর সুপারিশ করা হয় না, কেবল রেফারেন্সের জন্য রেখে দেওয়া হয়েছে।
নীচে স্নিপেট অ-নেতিবাচক পূর্ণসংখ্যার উপর কাজ করে। এটি যাচাই করে যে আপনার স্ট্রিংয়ে কোনও অ-অঙ্কিত অক্ষর নেই, খালি নয় এবং উপচে পড়ছে না ( int
প্রকারের জন্য সর্বাধিক মান অতিক্রম করে )। তবে এটি NULL
বৈধ পূর্ণসংখ্যার জন্যও দেয় যার শীর্ষস্থানীয় শূন্যগুলির কারণে দৈর্ঘ্য 10 টি অক্ষর অতিক্রম করে।
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
আপনি যদি কোনও নেতৃস্থানীয় শূন্যকে সমর্থন করতে চান তবে নীচে ব্যবহার করুন। CASE
অযৌক্তিক হলেও নেস্টেড বিবৃতি শর্ট সার্কিট মূল্যায়ন প্রচার এবং ত্রুটির সম্ভাবনা কমাতে প্রয়োজন (উত্থাপিত, উদাহরণস্বরূপ, নেতিবাচক দৈর্ঘ্য অতিক্রম করা থেকে LEFT
)।
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
আপনি যদি কোনও সংখ্যক শীর্ষস্থানীয় শূন্যের সাথে ইতিবাচক এবং নেতিবাচক পূর্ণসংখ্যার সমর্থন করতে চান :
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
শুভেচ্ছা।
আমি এসকিউএল সার্ভার ২০০৮-এর এসকিউএল সার্ভার ২০১২ এর TRY_CAST ফাংশন অনুকরণ করার জন্য একটি দরকারী স্কেলার ফাংশন লিখেছি।
আপনি এটি নীচের পরবর্তী লিঙ্কে দেখতে পারেন এবং আমরা একে অপরকে এটির উন্নতি করতে সহায়তা করি। এসকিউএল সার্ভার ২০০৮ এর জন্য TRY_CAST ফাংশন https://gist.github.com/jotapardo/800881eba8c5072eb8d99ce6eb74c8bb
দুটি প্রধান পার্থক্য হ'ল আপনাকে অবশ্যই 3 টি প্যারামিটার পাস করতে হবে এবং আপনাকে অবশ্যই ক্ষেত্রের মধ্যে একটি স্পষ্টরূপে কনভার্ট বা CAST সম্পাদন করতে হবে। তবে এটি এখনও খুব দরকারী কারণ এটি CAST সঠিকভাবে সম্পাদন না করা থাকলে আপনাকে ডিফল্ট মান ফিরিয়ে দিতে দেয়।
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, তারিখ, NUMERIC, বিআইটি এবং ফ্লোট ডেটা টাইপ সমর্থন করে
আশা করি এটি আপনার কাজে লাগবে।
কোড:
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
জোসেফের উত্তর নির্দেশিত 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
সংখ্যাটি যদি বড় মাপের চেয়ে বড় হয় তবে ফাংশনটি ব্যর্থ হবে।
আপনি যদি অন্য কোনও ডিফল্ট মান ফিরিয়ে দিতে চান তবে এই ফাংশনটি ছেড়ে দিন যাতে এটি জেনেরিক হয় এবং পরে নালটি প্রতিস্থাপন করুন:
SELECT IsNull(dbo.TryConvertInt('nan') , 1000);
আমি জানি এটি সুন্দর নয় তবে এটি সহজ। এটা চেষ্টা কর:
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
আমার এই সমস্যার সমাধানটি নীচে দেখানো ফাংশনটি তৈরি করা ছিল। আমার প্রয়োজনীয়তাগুলির মধ্যে অন্তর্ভুক্ত ছিল যে নম্বরটি একটি বিগিন্ট নয়, একটি মানক পূর্ণসংখ্যার হতে হবে এবং আমাকে নেতিবাচক সংখ্যা এবং ধনাত্মক সংখ্যার অনুমতি দেওয়া দরকার। আমি এমন কোনও পরিস্থিতি পাইনি যেখানে এটি ব্যর্থ হয়।
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