2009-06-26 57 views
5

在代碼中,可以指定全局可訪問的常量/枚舉/等,然後可以在整個應用程序中重複使用。這使得能夠使用像'馬自達'這樣有意義的名稱而不是像'2'這樣的數字。擺脫SQL Server中的「魔術」號碼

我們想在我們的SQL Server存儲過程中做同樣的事情,但不確定實現這一點的最佳方式。

如以下表格(諺語車模式)的

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

因此,而不是寫

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

我們想寫點東西像

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

一個限制我們得到的是我們不能依賴Manufacturer.Name在應用程序的生命中保持不變。我們沒想到有一列「守則」是永遠不會改變和聯接是看着像這樣:

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

我對這個有點猶豫,因爲它使用一個額外的加入,可以拼錯字符串比較。

什麼是最好的方式來完成,而不必在每個存儲過程中聲明變量?

回答

4

我們這樣做了幾個方面:

  • 用戶定義的函數,通過名字返回「幻數」。
  • 使用一個nchar(4)列而不是int列,並提出稍微難以理解的代碼。所以日產將是「NISN」而不是1個。更好一點。
+0

第一個建議被玩弄,但對於第二個建議來說太晚了。下次吧。 – 2009-06-26 01:30:49

+0

這個問題變得困難的事情是幻數通常對應於客戶端代碼中的枚舉。在某些時候,你會搞砸你的SQL查詢與客戶端枚舉。 MS SQL Server在這裏提供了一個非常簡潔的集成點:您可以編寫一個CLR UDF來返回枚舉值,從本質上強化一些運行時類型的安全性。您仍然需要確保您的查詢獲得枚舉值的名稱,但我從來沒有找到解決這部分問題的方法。 – 2009-06-26 12:15:56

1

您不需要在數據庫中存儲數字。有數據庫管理員仍然喜歡「自然鑰匙」的想法。他們不使用ID,而是使用唯一定義製造商的自然鍵。通常這會導致多個主鍵。您可能必須將「馬自達」「加拿大」作爲製造商的唯一標識符。

就我個人而言,我不喜歡這種方法,並且傾向於爲我的表中存儲的每個可識別對象都設置一個唯一的ID。這意味着創建一個查找的新表。 2,'Mazada'。然後,您可以創建一個視圖,在數據庫中有2個位置處拖動「Mazda」,然後對該視圖運行查詢。 SELECT * from v_cars where maker ='馬自達'