SQL Server安全地转换字符串并以静默方式失败

时间:2011-09-23 22:07:58

标签: sql-server

declare @input varchar(255) = 'abc'

select * from table where id = CAST(@input as int)

我可以这样做,以便演员表会无声地失败,或默认为某些用户提供的(或系统默认值)吗?

2 个答案:

答案 0 :(得分:13)

从SQL Server 2012起,您可以使用try_converttry_parse功能。

在那之前你可以使用

DECLARE @input VARCHAR(11) = 'abc'

SELECT * 
FROM table 
WHERE id =  CAST(CASE WHEN @input NOT LIKE '%[^0-9]%' THEN @input END AS INT)

您可能需要稍微调整一下测试(例如,它不允许使用负整数并允许大于最大int的正数)但如果找到合适的测试(e.g. the one here)并使用CASE声明您应该避免任何投射错误,因为CASE的评估顺序是mostly保证。

答案 1 :(得分:1)

您可以将您的选择放在TRY-CATCH块中,然后使用默认值在CATCH中重新发出查询。