2009-06-26 17 views
5

Nel codice uno è possibile specificare costanti/enum/ecc accessibili globalmente una volta che possono essere riutilizzati attraverso l'applicazione. Questo dà la possibilità di usare nomi significativi come "Mazda" invece di numeri come "2".Sbarazzarsi dei numeri "Magic" in SQL Server

Vorremmo fare lo stesso con le nostre stored procedure di SQL Server, ma non siamo sicuri del modo migliore di implementarlo.

Ad esempio per le seguenti tabelle (Lo schema macchina proverbiale):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

Così, invece di scrivere

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

Vorremmo scrivere qualcosa di simile

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

Una restrizione abbiamo è che non possiamo fare affidamento sul Manufacturer.Name che rimane lo stesso per la vita dell'App. Noi pensavamo di avere una colonna "Codice" che non cambia mai ed il join sono guardato in questo modo:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

io sono un po 'titubante su questo in quanto utilizza un join in più e confronti tra stringhe che possono essere errori di ortografia .

Qual è il modo migliore per farlo senza dover dichiarare le variabili in ogni stored procedure?

risposta

4

Abbiamo fatto questo un paio di modi:

  • funzione definita dall'utente che restituisce il "numero magico" di nome.
  • Utilizzare una colonna nchar (4) anziché la colonna int e ottenere codici leggermente meno imperscrutabili. Quindi Nissan sarebbe "NISN" invece di 1. Un po 'più bello.
+0

Giocato con il primo suggerimento, ma è troppo tardi per il secondo. Forse la prossima volta. –

+0

La cosa che diventa difficile con questo problema è che il numero magico di solito corrisponde a un enum nel codice del client. A un certo punto si rovinerà la sincronizzazione della ricerca SQL con il client enum. MS SQL Server offre un punto di integrazione molto ordinato qui: è possibile codificare un UDF CLR per restituire il valore enum, applicando essenzialmente alcuni tipi di sicurezza di runtime. Devi comunque assicurarti che le tue query abbiano i nomi dei valori enum, ma non ho mai trovato il modo di aggirare questa parte del problema. –

1

Non è necessario memorizzare i numeri nel database. Ci sono amministratori DB là fuori che amano ancora l'idea di "chiavi naturali". Invece di usare un ID, usano semplicemente una chiave naturale che definisce in modo univoco il produttore. Spesso questo può portare a più chiavi primarie. Potrebbe essere necessario avere un 'Mazda' 'Canada' come identificativo univoco per il produttore.

Personalmente, non mi piace questo metodo e preferisco avere un ID univoco per ogni oggetto identificabile memorizzato nelle mie tabelle. Questo significa creare una nuova tabella che è una ricerca. 2, 'Mazada'. Quindi puoi creare una vista che estrae 'Mazda' in cui ci sono 2 nel database, quindi esegui la query sulla vista. SELEZIONA * da v_cars dove maker = 'Mazda'

+0

Oltre ad essere in ritardo per modificare l'accordo, sono d'accordo con te sul non utilizzare le chiavi naturali in questi casi in quanto rende più facile l'uso di enumerazioni in codice. Mi piace l'idea della vista. –