2017-07-31 96 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