1

エラーが発生したときに行をスキップして次の行に移動できるようにするストアドプロシージャをSQLサーバーに作成したいと考えています。たとえば、「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

失敗する行を除外する where 句を追加できます。

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

最善の解決策は、すべてをよりプログラム化することです。問題は、スペースの前の文字数を確認してから 3 を引いていることです。毎回 3 を引く代わりに数値を計算し、0 を下回らないようにすれば、エラーは解決します。

于 2013-09-17T22:01:18.427 に答える
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;

casewhen一般に、句を順番に評価することが保証されてthenいます (集約関数に関連する例外がありますが、この場合は適用されません)。

于 2013-09-17T22:10:27.187 に答える