nvarcharを整数にキャストするための次のコードがあります。
cast(@value as int)
ただし、パラメーター@valueを制御できないため、コードが失敗する可能性があります。キャストを行う前にキャストが可能かどうかを確認する方法はありますか?
nvarcharを整数にキャストするための次のコードがあります。
cast(@value as int)
ただし、パラメーター@valueを制御できないため、コードが失敗する可能性があります。キャストを行う前にキャストが可能かどうかを確認する方法はありますか?
SQL Server 2012では新しいTRY_CAST()を使用できますが、SQL Server 2008ではISNUMERIC()を使用して、そのテストに合格しない値の処理を含めることができるはずです。
私は最近これについての質問に答えました、そして、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
幸運を。
私は一般的に以下を使用します、それはすべての状況をカバーしているようです。
SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END
「ISNUMERIC」では2つの期間が許可されないという事実を利用しています。ただし、SQLServer2012以降の「TRY_CAST」ははるかに優れたソリューションです。
適切なテストは次のとおりです。
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)
たぶん私たちはこのようなことをすることができます:
declare @value as nvarchar(10) = 'A';
begin try
select cast(@value as int);
end try
begin catch
-- do something
end catch
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'