SSMS 12 SP比较int和VarChar

时间:2017-07-31 17:49:03

标签: sql sql-server geocoding ssms-2012

我接管了一个程序,发现在我的一个存储过程中,有一个SSIS作业在SP上随机失败,读取地理编码服务的XML输出并将值解析为SQL字段,如下所示:

   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 个答案:

答案 0 :(得分: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),它将允许您获取有助于排除故障的错误的详细信息。