2017-07-31 6 views
1

私はプログラムを引き継いで、私のストアドプロシージャの1つに、ジオコーディングサービスのXML出力を読み込んで値を解析するSPでランダムに失敗するSSISジョブがあることがわかりましたintとVarCharを比較するSSMS 12 SP

INSERT #out_p_geocode_addresses 
--where my following SP's are looking for the successfully geocoded addresses 
(address_id int 
,score int 
,lat int 
,lon int 
,standard_address VARCHAR(max) 
,geocode_match_flag bit 
) 

SELECT t.address_id 
,CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionScore")]')) 
,CASE 
--Retrieves the 'Y' geocode value and sets it to the 'lat' field 
    WHEN ISNUMERIC(CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionShape")]/Y[1]'))) = 1 
     THEN CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionShape")]/Y[1]')) 
END 
,CASE 
--Retrieves the 'X' geocode value and sets it to the 'lon' field 
    WHEN ISNUMERIC(CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionShape")]/X[1]'))) = 1 
     THEN CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionShape")]/X[1]')) 
END 
--sets value for the standard_address Field 
,CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionMatch_addr")]')) 
,CASE 
--sets the geocode_match_flag to 'Y' if the 'lon' field is numeric and not null or sets the value to 'N' 
    WHEN ISNUMERIC(CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionShape")]/X[1]'))) = 1 
     THEN 'Y' 
    ELSE 'N' 
ENDFROM #batch_p_geocode_addresses AS t 
JOIN @GeocodeResultXML.nodes('//RecordSet/Records/Record') 
               AS Records(Record) 
ON t.address_id = CONVERT(VARCHAR(MAX),Records.Record.query('./Values/Value[sql:variable("@positionResultId")]')) 

このジョブの問題はランダムには発生せず、常に100回以上実行した後に発生します。しかし、JOINの比較では、なぜそれが全く動作しているのか理解できません。

この比較がうまくいかない理由、またはこのSPを呼び出すときにランダムに失敗する理由を説明できますか?

ご協力いただければ幸いです。

答えて

1

ほとんどのレコードが失敗するレコードは、ソース内のほとんど常に悪い(または予期しない、少なくとも)データです。

SQL 2012以降を使用している場合は、CONVERTをTRY_CONVERTに切り替えることをおすすめします。 CONVERTの値が正しくないと、エラーが発生します。 TRY_CONVERTの値が正しくないと、NULL結果が返されます。

トラブルシューティングに役立つエラーの詳細を確認できるように、キャッチ(TRY CATCH)の表記(https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql)も参照する必要があります。

+0

私は上記のSPを呼び出すためにTry/Catchブロックを使用していますが、私はTRY-CONVERTを調べます。私はそれを聞いたので、私はそれがどのように動作するか熱望しています – tCoe