2017-07-31 94 views
1

我接管了一個程序,發現在我的一個存儲過程中,有一個SSIS作業在SP中隨機失敗,它讀取地理編碼服務的XML輸出並解析值到SQL領域,像這樣:SSMS 12 SP比較int和VarChar

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

我正在使用Try/Catch塊來調用上面的SP,但我會研究TRY-CONVERT ..我有點沒聽說過,所以我很想看看它是如何工作的 – tCoe