J'ai une procédure stockée avec laquelle j'essaye de travailler pour la rendre plus efficace. Malheureusement, il est actuellement potentiellement utilisé par de nombreuses applications, donc bien que ma solution optimale soit de le réécrire, je suis actuellement contraint par ce qui est là.Force un court-circuit sur une instruction CASE
Initialement, il existe deux paramètres d'entrée, tous deux VARCHAR. J'ai besoin de faire une comparaison entre les deux types de données différents en fonction de la valeur du premier paramètre. Cependant, j'obtiens des erreurs de conversion quand elles ne devraient pas exister. Exemple:
PROCEDURE ProcedureName
@SearchType VARCHAR(24)
, @SearchID VARCHAR(100)
AS
BEGIN
SELECT
t1.*,
t2.*
FROM
TableOne t1
JOIN TableTwo t2
WHERE
(CASE
WHEN UPPER(@SearchType) = 'GUID' THEN CAST(t2.guid AS VARCHAR(100))
WHEN UPPER(@SearchType) = 'ID' THEN t2.id
WHEN UPPER(@SearchType) = 'ANOTHERID' THEN t1.id
END)
=
(CASE
WHEN UPPER(@SearchType) = 'GUID' THEN @SearchID
WHEN UPPER(@SearchType) = 'ID'
OR UPPER(@SearchType) ='ANOTHERID' THEN CAST(@SearchID AS INT)
END)
END
L'objectif est ici si le type de recherche est GUID, il convertira la colonne guid dans le tableau et de faire une comparaison avec la chaîne d'entrée. Étant donné que les deux champs ID de la base de données sont des colonnes de type int, je voudrais convertir le SearchID, qui aura un type de données sous-jacent d'entier lorsque ID ou ANOTHERID sont passés, en un type entier pour correspondre au type de colonne natif. Cependant, chaque fois que j'essaie d'exécuter ceci avec GUID dans @SearchType et un guid dans @SearchID, j'obtiens cette erreur: La conversion a échoué lors de la conversion de la valeur varchar '< @SearchID>' en type de données int.
Cette déclaration de cas ne devrait-elle pas être en court-circuit, donc aucune conversion en int ne devrait jamais se produire avec cette entrée? Puis-je le forcer à court-circuiter?
Supprimer tous les calculs et conversions de la clause 'where', déclarer trois variables de types appropriés, les affecter avant l'instruction' select' et utiliser prêt à comparer les variables dans 'where'. Et mettre 'option (recompiler)' 'car le plan stocké ne vous réconfortera pas lors des prochaines courses. –
J'ai ajouté ce qui suit à la procédure: 'IF UPPER (@SearchType) = 'ID' OU UPPER (@SearchType) = 'ANOTHERID' BEGIN SET @IntSearchID = CAST (@SearchID AS INT) END' Je puis faites la comparaison à la fin avec une seule nouvelle variable, car la variable d'entrée est déjà un varchar, et les deux autres options sont toutes deux int: WHEN UPPER (@SearchType) = 'ID' OU UPPER (@SearchType) = 'ANOTHERID 'THEN @IntSearchID Cependant, je reçois toujours l'erreur de conversion. – Smoothjedi