Dans le code on peut spécifier globalement les constantes accessibles/enums/etc une fois que cela peut ensuite être réutilisé à travers l'application. Cela donne la possibilité d'utiliser des noms significatifs comme 'Mazda' au lieu de nombres comme '2'.Se débarrasser des nombres "Magic" dans SQL Server
Nous aimerions faire de même avec nos procédures stockées SQL Server, mais nous ne sommes pas sûrs de la meilleure façon de l'implémenter.
Par exemple, pour les tableaux suivants (Le schéma voiture proverbiale):
Car ManufacturerId
350Z 1
Hilux 2
Yaris 2
ManufacturerId Name
1 Nissan
2 Toyota
Ainsi, au lieu d'écrire
SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan
Nous voudrions écrire quelque chose comme
SELECT * FROM Car WHERE ManufacturerId = @Nissan
Une restriction nous avons est que nous ne pouvons pas compter sur le Manufacturer.Name rester le même pour la vie de l'App. Nous avons pensé d'avoir une colonne « Code » qui ne change jamais et les jointures sont recherchés comme ceci:
SELECT *
FROM Car c
INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId
WHERE m.Code = 'Nissan'
Je suis un peu hésitant sur ce qu'il utilise un supplément de jointure et les comparaisons de chaînes qui peuvent être mal orthographiés .
Quelle est la meilleure façon d'y parvenir sans avoir à déclarer les variables dans chaque procédure stockée?
Joué avec la première suggestion, mais il est trop tard pour le second. Peut-être la prochaine fois. –
La chose qui devient difficile avec ce problème est que le nombre magique correspond généralement à une énumération dans votre code client. À un certain moment, vous allez bousiller la synchronisation de votre recherche SQL avec le client enum. MS SQL Server offre ici un point d'intégration très ordonné: vous pouvez coder une UDF CLR pour renvoyer la valeur enum, en appliquant essentiellement une certaine sécurité de type à l'exécution. Vous devez toujours vous assurer que vos requêtes obtiennent les noms des valeurs enum, cependant, je n'ai jamais trouvé un moyen de contourner cette partie du problème. –