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

DMa*_*yer 6 sql-server

declare @input varchar(255) = 'abc'

select * from table where id = CAST(@input as int)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 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)
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微调整一下测试(例如,它不允许使用负整数并允许使用大于最大值的正整数),但如果您找到合适的测试(例如此处的测试)并使用CASE语句,则应避免任何投射错误作为顺序评价为CASE主要保证.