我尝试将表的字段中的字符串值强制转换为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中的值无法播放,请避免使用强制转换)?
答案 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()检查并CAST
至INT
,否则请将其保留为文字,如下所示:
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