1

我想在 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;

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

4

2 回答 2

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(有涉及聚合函数的例外,但它们不适用于这种情况)。

于 2013-09-17T22:10:27.187 回答
0

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

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

最好的解决方案是让一切都更加程序化。问题是您正在检查空格前有多少个字符,然后减去 3。如果您可以计算一个数字而不是每次都减去 3 并避免低于 0,那将解决错误。

于 2013-09-17T22:01:18.427 回答