我如何"跳过"如果sql函数出现故障,则为一行

时间:2013-09-17 21:43:21

标签: sql sql-server function

我想在sql server中创建一个存储过程,这将允许我跳过该行并在遇到错误时继续前进到下一行。例如,当我传入'BOZ3C 51'的输入时,它可以工作,但失败并出现错误 - '传递给LEFT或SUBSTRING函数的长度参数无效。'当它遇到'C Z3C'

的输入时
BEGIN TRY
select distinct LEFT(SUBSTRING(ticker,1,CHARINDEX(' ',ticker) -1),len(SUBSTRING(ticker,1,CHARINDEX(' ',ticker) -1))-3)as CLASS 
from SECURITY
SET @RETMSG = 'SUCCESS'
END TRY
BEGIN CATCH
SET @RETMSG = 'SecClass ERRNUM: ' + CONVERT(VARCHAR, ERROR_NUMBER()) + ' SecClass     ERRMSG: ' + ERROR_MESSAGE();
print @RETMSG
END CATCH;

我该如何处理这种情况?感谢指点。

2 个答案:

答案 0 :(得分:0)

您可以添加一个where子句来过滤掉将失败的行。

where len(SUBSTRING(tinker,1,CHARINDEX(' ',tinker) -1)) - 3 >= 0

最好的解决方案是让一切更具有编程性。问题是你要检查一个空格前面有多少个字符,然后减去3.如果你可以计算一个数字而不是每次减去3而避免低于0,那就可以解决错误。

答案 1 :(得分:0)

保证在SQL Server中避免错误的唯一方法是使用case语句。 SQL Server保留重新安排操作的权利。 。 。这意味着SELECT中的计算可能会在WHERE过滤之前发生。

select distinct (case when len(SUBSTRING(tinker,1,CHARINDEX(' ',tinker) -1)) >= 3
                      then LEFT(SUBSTRING(ticker,1,CHARINDEX(' ',ticker) -1),len(SUBSTRING(ticker,1,CHARINDEX(' ',ticker) -1))-3)as CLASS 
                 end) -- if not appropriate format, then return `NULL`
from SECURITY;

case通常保证按顺序和when之前评估then子句(有涉及聚合函数的异常,但在这种情况下它们不适用)。 / p>