28

nvarcharを整数にキャストするための次のコードがあります。

     cast(@value as int)

ただし、パラメーター@valueを制御できないため、コードが失敗する可能性があります。キャストを行う前にキャストが可能かどうかを確認する方法はありますか?

4

6 に答える 6

32

SQL Server 2012では新しいTRY_CAST()を使用できますが、SQL Server 2008ではISNUMERIC()を使用して、そのテストに合格しない値の処理を含めることができるはずです。

于 2013-02-06T01:02:07.917 に答える
12

私は最近これについての質問に答えました、そして、toに使用ISNUMERICするCASTことINTはそれ自体では機能しません。理由は、ISNUMERICたとえば非整数(1.5)の場合はtrueを返します。

この件に関する最近の回答は次のとおりです。

https://stackoverflow.com/a/14692165/1073631

ISNUMERICでCHARINDEXを使用して追加のチェックを追加することを検討してください。または、私が好むのは、正規表現を使用してデータを検証することです。

そして、これがISNUMERICを単独で使用する際の問題を示すフィドルです。そして、代わりに正規表現を使用するフィドルが機能します。

DECLARE @Test nvarchar(10)
SET @Test = '1.5'
--Works
SELECT CASE WHEN @Test NOT LIKE '%[^0-9]%' THEN CAST(@Test as int) ELSE 0 END 
-- Produces Error
SELECT CASE WHEN ISNUMERIC(@Test) = 1 THEN CAST(@Test as int) ELSE 0 END 

幸運を。

于 2013-02-06T01:34:42.410 に答える
8

私は一般的に以下を使用します、それはすべての状況をカバーしているようです。

SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END

「ISNUMERIC」では2つの期間が許可されないという事実を利用しています。ただし、SQLServer2012以降の「TRY_CAST」ははるかに優れたソリューションです。

于 2017-04-30T01:59:03.707 に答える
2

適切なテストは次のとおりです。

select (case when isnumeric(val) = 1 and val not like '%e%' and val not like '%.%'
             then cast(val as int)
        end)

この関数isnumeric()は、floatのように見えるものに対して1を返すため、注意する必要があります。

また、SQLServerの特徴であると私が考えるものを使用することもできます。浮動小数点値1.23をintにキャストすることはできますが、文字列値をキャストすることはできません。したがって、以下も機能します。

select (case when isnumeric(val) = 1
             then cast(cast(val as float) as int)
        end)
于 2013-02-06T01:53:57.280 に答える
1

たぶん私たちはこのようなことをすることができます:

declare @value as nvarchar(10) = 'A';

begin try
    select cast(@value as int);
end try
begin catch
-- do something
end catch
于 2013-02-06T05:17:16.060 に答える
0

TRY CATCHブロックを使用したプロシージャを使用して、エラーを抑制します

すなわち

CREATE PROCEDURE p_try_cast
 @type nvarchar(MAX),
 @value nvarchar(MAX)
AS
BEGIN

    BEGIN TRY
        DECLARE @sql        varchar(MAX)
        DECLARE @out_table  TABLE(value varchar(MAX))

        SET @sql = 'SELECT  CONVERT(varchar(max), CAST(''' + @value + ''' AS ' + @type + '))'

        INSERT  @out_table
        EXECUTE (@sql)

        IF EXISTS ( SELECT 1 FROM @out_table WHERE value = @value)
            RETURN 1

        RETURN 0
    END TRY
    BEGIN CATCH
        RETURN 0
    END CATCH

END

GO

これで、渡された文字列と目的のタイプを使用してこれを呼び出すことができ、procは成功の場合は1を返し、失敗の場合は0を返します。

DECLARE @ret int

-- This returns 0 - Fail
EXEC @ret = p_try_cast 'integer', '1.5'

-- This returns 1 - Success
EXEC @ret = p_try_cast 'integer', '1.5'

-- This returns 0 - Fail
EXEC @ret = p_try_cast 'char(4)', 'HELLO'

-- This returns 1 - Success
EXEC @ret = p_try_cast 'char(4)', 'HELL'
于 2017-11-20T17:15:06.223 に答える