我想在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;
我该如何处理这种情况?感谢指点。
答案 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>