SQL Server 2014:如果值可以转换,如何将字符串值转换为int?

时间:2016-11-17 10:10:15

标签: sql sql-server sql-server-2014

我尝试将表的字段中的字符串值强制转换为int,但仅在值存储可以转换为int的值的情况下(在另一种情况下,必须返回原始值)。例如:

   DECLARE @ErrorCode nvarchar(1024)
   SET @ErrorCode = 'a10'
   SELECT IIF(TRY_CAST(@ErrorCode AS int) IS NULL, @ErrorCode, CAST(@ErrorCode AS int))

我在StackOverflow上看过类似的代码。

我的问题是SQL Server(2014)似乎没有短路,并且总是执行强制转换,即使TRY_CAST(@ErrorCode AS int)导致NULL。上面代码的结果是错误“将nvarchar值'a10'转换为数据类型int时转换失败。”

请参阅this sample on rextester.com

我还尝试了其他具有相同结果的变体:

SELECT CASE WHEN TRY_CAST(@ErrorCode AS int) IS NULL THEN @ErrorCode ELSE (SELECT CAST(@ErrorCode AS int)) END
SELECT CASE TRY_CAST(@ErrorCode AS int) WHEN 1 THEN CAST(@ErrorCode AS int) ELSE @ErrorCode END

如何实现我的目标(如果@ErrorCode中的值无法播放,请避免使用强制转换)?

3 个答案:

答案 0 :(得分:1)

要验证NULL,您应该IS NULL

DECLARE @ErrorCode NVARCHAR(1024)

SET @ErrorCode = 'a10'

SELECT IIF(TRY_CAST(@ErrorCode AS int) IS NULL, @ErrorCode, CAST(CAST(@ErrorCode AS int) AS VARCHAR(50)))

您需要再次将INT再次转换为VARCHAR以避免隐式转换。 IIF返回true_value和false_value中类型具有最高优先级的数据类型。

答案 1 :(得分:1)

简单的解决方案是使用COALSECE

DECLARE @ErrorCode nvarchar(1024)
SET @ErrorCode = 'a10'
SELECT COALSECE(CAST(TRY_CAST(@ErrorCode AS int) as nvarchar(1024)), @ErrorCode)

但是,我没有看到转换为int然后回到nvarchar的重点。

答案 2 :(得分:0)

我看到的问题是尝试在一列中保留两种不同的类型。我不确定您打算如何使用此信息,但您可以根据类型将值拆分为数字和文本列。如果确实如此,您可以ISNUMERIC()检查并CASTINT,否则请将其保留为文字,如下所示:

CREATE TABLE #ErrorCodes ( ErrorCode NVARCHAR(10) )

INSERT  INTO #ErrorCodes
        ( ErrorCode )
VALUES  ( '123' ),
        ( 'a10' ),
        ( 'bbb' ),
        ( '456' )

SELECT  ErrorCode AS OriginalVal ,
        CASE WHEN ISNUMERIC(ErrorCode) = 1 THEN CAST(ErrorCode AS INT)
             ELSE NULL
        END AS NumericVal ,
        CASE WHEN ISNUMERIC(ErrorCode) = 0 THEN ErrorCode
             ELSE NULL
        END AS NonNumericVal
FROM    #ErrorCodes

DROP TABLE #ErrorCodes

<强>产地:

OriginalVal NumericVal  NonNumericVal
=====================================
123         123         NULL
a10         NULL        a10
bbb         NULL        bbb
456         456         NULL