2009-07-29 6 views
6

Wir definieren derzeit eine Liste von Konstanten (meist diese Aufzählungen entsprechen wir in der Business-Schicht definiert haben) an der Spitze einer gespeicherten Prozedur wie folgt:Was sind die verschiedenen Möglichkeiten, 'Enumerations' in SQL Server zu behandeln?

DECLARE @COLOR_RED INT = 1 
DECLARE @COLOR_GREEN INT = 2 
DECLARE @COLOR_BLUE INT = 3 

Aber diese oft wiederholt erhalten für viele gespeicherte Prozeduren so es gibt viel Doppelarbeit.

Eine andere Technik, die ich verwende, wenn die Prozedur nur eine oder zwei Konstanten benötigt, besteht darin, sie als Parameter an die gespeicherte Prozedur zu übergeben. (mit der gleichen Konvention von Großbuchstaben für konstante Werte). Auf diese Weise bin ich mir sicher, dass die Werte in der Business-Schicht und Daten-Ebene konsistent sind. Diese Methode eignet sich nicht für viele Werte.

Was sind meine anderen Optionen?

Ich verwende SQL Server 2008 und C#, wenn es einen Unterschied macht.

Update Da ich .Net verwende, gibt es irgendeine Möglichkeit, die benutzerdefinierte (CLR) Typen helfen können?

Antwort

2

Ich kann zwei verschiedene Ansätze vorschlagen:

1) Definieren Sie eine Enumeration Tabelle mit einer tinyint Identitätsspalte als Primärschlüssel und der Enum-Wert als einen eindeutigen Index; z.B.

CREATE TABLE [dbo].[Market](
     [MarketId] [smallint] IDENTITY(1,1) NOT NULL, 
     [MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL, 
CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED 
(
     [MarketId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

dann entweder:

  • Haben Sie Ihre Anwendung bei der Inbetriebnahme die Aufzählung zu Primärschlüsselwert-Mapping laden (dies unter der Annahme konstant bleiben).
  • Definieren Sie eine Funktion zum Konvertieren von Aufzählungswerten in Primärschlüsselwerte. Diese Funktion kann dann von gespeicherten Prozeduren verwendet werden, die Daten in andere Tabellen einfügen, um den Fremdschlüssel für die Aufzählungstabelle zu bestimmen.

2) gemäß (1), aber jeder Primärschlüsselwert definieren, um eine Potenz von 2. Dies ermöglicht eine weitere Tabelle mehr Enumerationswerten direkt ohne die Notwendigkeit für eine zusätzliche Zuordnungstabelle zu verweisen. Angenommen, Sie definieren eine Farbaufzählungstabelle mit Werten: {1, 'Rot'}, {2, 'Blau'}, {4, 'Grün'}. Eine andere Tabelle könnte auf rote und grüne Werte verweisen, indem der Fremdschlüssel 5 (d. H. Das bitweise ODER von 1 und 4) eingeschlossen wird.

+0

Ein Fremdschlüssel für die Aufzählungen ist gut, aber wie werden die Werte in einer gespeicherten Prozedur verwendet? – tpower

+0

@tpower: Nicht ganz sicher, verstehe ich Ihre Frage, aber ich würde in der Regel die Enum-String-Werte in die Sproc übergeben und sie sofort in Fremdschlüssel mit der Funktion, die ich erwähnt, zu übersetzen. Daher behandelt die App nur Enumerationswerte, der DB-Code behandelt nur die Fremdschlüsselwerte. – Adamski

+0

Was ich meine, ist, wenn die gespeicherte Prozedur einige Geschäftslogik wie 'IF @MyVariable = @ MY_ENUMERATION_VALUE_2 THEN' enthält, wo wir den Wert angeben müssen Fremdschlüssel hier nicht helfen. – tpower

2

Scalar Benutzer definieren Funktion? Nicht perfekt, aber funktionell ...

CREATE FUNCTION dbo.ufnRGB (
    @Colour varchar(20) 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @key int 

    IF @Colour = 'BLue' 
     SET @key = 1 
    ELSE IF @Colour = 'Red' 
     SET @key = 2 
    ELSE IF @Colour = 'Green' 
     SET @key = 3 

    RETURN @KEy 
END 
1

ich nicht die Idee der Definition dessen, was mögen sind effektiv Konstanten für gespeicherte Prozeduren an mehreren Stellen - dies scheint wie ein Alptraum in Sachen Wartung und ist leicht anfällig für Fehler (Tippfehler usw.). In der Tat kann ich nicht viele Umstände sehen, wenn Sie so etwas tun müssten?

Ich würde definitiv alle Aufzählungsdefinitionen an einem Ort behalten - in Ihren C# -Klassen. Wenn das bedeutet, dass Sie sie jedes Mal an Ihre Prozeduren weitergeben müssen, so sei es. Zumindest werden sie immer nur an einem Ort definiert.

Um dies zu vereinfachen, könnten Sie einige Hilfsmethoden für den Aufruf Ihrer Prozeduren schreiben, die automatisch die enum-Parameter für Sie übergeben. Sie rufen also eine Hilfsmethode nur mit dem Prozedurnamen und den "Variablen" -Parametern auf, und dann fügt die Hilfsmethode den Rest der Aufzählungsparameter für Sie hinzu.

3

Dies könnte umstritten sein: meine Take ist keine Aufzählungen in T-SQL verwenden. T-SQL ist nicht wirklich so konzipiert, dass Enums nützlich sind, so wie sie in anderen Sprachen sind. In T_SQL fügen sie einfach nur Aufwand und Komplexität hinzu, ohne den Nutzen, den man anderswo sieht.

+1

Ich stimme zu, es ist eine Datenbank. Die Zuordnung zwischen einem Namen und einem Wert sollte in einer Tabelle erfolgen. – nocache

1

Wie wäre es mit einer Skalarfunktion als Konstante? Eine Benennungskonvention würde ihre Verwendung in der Nähe von Aufzählungen machen:

CREATE FUNCTION COLOR_RED() 
RETURNS INT 
AS 
BEGIN 
    RETURN 1 
END 

CREATE FUNCTION COLOR_GREEN() 
RETURNS INT 
AS 
BEGIN 
    RETURN 2 
END 

... 
Verwandte Themen