2009-06-26 54 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 ='马自达'