Simuler enums dans TSQL?
Récemment, j'ai accidentellement écrit un vraiment laid stockées proc où j'aurais voulu avoir des enums,
Par exemple.
CREATE PROCEDURE Proc_search_with_enum @user int, @account_category {enum}
Je comprends que SQL 2000 n'ont pas les énumérations comme un premier de la classe de langue de construire, de conventions de codage utilisez-vous pour simuler les énumérations ou traiter le même problème?
Ou suis je suis je condamnée à juste à l'aide de type VARCHAR et SI @account_category='cat1'?
EDIT: T-SQL et C# sont les langues du client.
EDIT: Merci à tous! Beaucoup de bons conseils, je souhaite que je pourrais accepter plusieurs réponses, j'ai voté tout le monde-
Résumé des réponses
- Appuyer sur C#'enum en utilisant int. Bon
pour C# code client, rend TSQL client
code moins lisible. - Utilisation Char/Varchar. Mauvais pour le C# code client
(pas bon pour la localisation), en fait
TSQL code plus lisible. - Utiliser le paramètre de code de vérification de restreindre
le paramètre, ou l'utilisation d'une contrainte sur
une colonne de table ou une clé étrangère s'
le paramètre va être inséré
dans une table.
source d'informationauteur MatthewMartin
Vous devez vous connecter pour publier un commentaire.
Vous pouvez prendre un coup d'oeil à la réponse à cette question. Autant que je sache, les types enum ne font pas partie de SQL Server.
De toute façon, il est préférable d'utiliser une partie intégrante (
INT
TINYINT
...) type de votre enums qu'un type de chaîne. Habituellement, les types enum dans votre langage de programmation de choix correspondent au mieux aux entiers que pour les cordes.En C# par défaut, chaque valeur d'énumération correspond à un nombre entier, à partir de 0. Vous pouvez même faire entre eux, donc c'est un code valide:
Et LINQtoSQL prend également en charge cette. Si vous avez une énumération de type de propriété et de votre colonne de base de données est un type entier, la conversion est automatique.
Dans PostgreSql, je viens de l'utiliser VARCHARs avec des contraintes attachées ...
Je n'aime pas utiliser les types numériques pour la simulation des ENUMs, parce qu'ils ne sont pas suffisamment explicites. Avec le schéma ci-dessus, je peux voir tout de suite ce que les valeurs qu'il reçoit, et j'ai également le sens de ces valeurs. Je reçois aussi le type de sécurité, puisque je ne peux pas insérer des valeurs non valides dans cette colonne.
Pour plus de détails sur les contraintes pour Postgres, voir ici:
http://www.postgresql.org/docs/8.1/static/ddl-constraints.html
En général, je préfère l'appeler le paramètre @account_category_code et d'en faire un CHAR(3), s'il y a seulement quelques valeurs enum et ils peuvent tous être exprimés proprement avec trois lettres. Le domaine est appliquée avec une contrainte de vérification. Si il y a plus d'une poignée de valeurs (de plus de 4 ou 5), alors je voudrais généralement passer à un tinyint/smallint appelé @account_category_type_id et ont un domaine de table de référence. Nous n'avons pas une règle dure et rapide au sein de mon entreprise, mais je trouve que cela fonctionne bien.
Vous pouvez créer une vue de simuler l'Enum. Voir cet article http://www.olegsych.com/2008/07/t4-template-for-generating-sql-view-from-csharp-enumeration/
Parfois du type CHAR est plus utilisable que INT - taille fixe char ne prend pas beaucoup de salle de stockage et vous pouvez voir "énumérées" directement les valeurs dans les champs de base de données. Pas de différence de code, mais grand à l'avance tout en travaillant directement avec les outils SQL.
Être exteremely prudent dans l'utilisation de CHAR type enum, et éviter à tout, si vous voulez que votre application/db aller à l'étranger.
Ne pas confondre les DONNÉES de présentation: comme les mots devraient suggérer, un enum(eration) est un nombre, c'est la description est totalement différente d'une entreprise. Pour faire court, à l'aide d'une variable CHAR/champ pour un enum, vous attachez-vous à une langue en particulier, pour leur description: vous pouvez oublier internazionalization, par exemple. Pouvez-vous imaginer ce que le mot "Weltmeisterschaft" signifie, dans la langue, et - d'ailleurs - de combien de façons différentes d'écrire mal il peut être?
En fait, une (infime)int a fait la baisse des valeurs qui ne sont pas intrisecally auto-descriptif: je n'ai pas dit que c'est la solution parfaite!
En SQL, vous énumérer les éléments en les mettant dans un tableau. Créer une table de recherche pour votre compte catégories et ont de ce paramètre accepter la clé primaire de la table.
La meilleure façon de le faire dans les instructions Transact-SQL est avec une Contrainte de VÉRIFICATION. Vous pouvez en lire plus à ce sujet ici ou ici. Cette contrainte est également disponible dans PostgreSQL et Oracle.
Vous pouvez utiliser un CAS de déclaration.
Pour créer un enum-esque exemple à partir d'un jeu de résultats, vous pourriez faire quelque chose comme ceci:
En gros, vous exécutez un entier par le biais de quelque chose comme une instruction SWITCH. Mettre dans votre procédure stockée de sorte que vous n'avez pas à écrire le même code. Espérons que cette aide.
enter code here