2017-07-31 1 views
1

J'ai repris un programme et trouvé que dans une de mes procédures stockées, il y a un travail SSIS qui échoue aléatoirement au SP qui lit la sortie XML du service de géocodage et analyse les valeurs dans les champs SQL, comme celui-ci:SSMS 12 SP comparant int et 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")]')) 

J'ai eu un problème avec ce travail ne hasard, et toujours après l'exécution de l'étape précédente plus de 100 fois. Cependant avec la comparaison de JOIN, je ne peux pas comprendre pourquoi il fonctionne du tout ...

Quelqu'un pourrait-il expliquer pourquoi cette comparaison fonctionne, ou pourquoi elle pourrait échouer de manière aléatoire en appelant ce SP?

Toute aide serait grandement appréciée.

Répondre

1

Certains enregistrements qui échouent alors que la plupart réussissent sont presque toujours de mauvaises données (ou au moins inattendues) dans la source. Si vous utilisez SQL 2012 ou plus récent, je vous recommande de passer le CONVERT à TRY_CONVERT. Une mauvaise valeur sur CONVERT donne une erreur. Une mauvaise valeur sur TRY_CONVERT donne un résultat NULL que vous pouvez ensuite gérer.

Vous devriez également vous pencher sur la notation TRY CATCH (https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql) qui vous permettra d'obtenir des détails sur l'erreur qui devrait aider au dépannage.

+0

J'utilise un bloc Try/Catch pour appeler le SP ci-dessus, mais je vais regarder dans TRY-CONVERT .. Je n'ai pas entendu parler de ça, donc je suis impatient de voir comment cela fonctionne – tCoe