摆脱SQL Server中的"魔术"数字

Rob*_*ner 5 sql sql-server

在代码中,可以指定一次全局可访问的常量/枚举/等,然后可以在整个应用程序中重用它们.这使得能够使用像'Mazda'这样有意义的名称而不是像'2'这样的数字.

我们希望在SQL Server存储过程中也这样做,但不确定实现它的最佳方法.

例如,对于下表(众所周知的汽车模式):

Car       ManufacturerId 
350Z       1
Hilux      2
Yaris      2

ManufacturerId   Name
1                Nissan
2                Toyota
Run Code Online (Sandbox Code Playgroud)

所以不要写作

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan
Run Code Online (Sandbox Code Playgroud)

我们想写类似的东西

SELECT * FROM Car WHERE ManufacturerId = @Nissan
Run Code Online (Sandbox Code Playgroud)

我们的一个限制是我们不能依赖于Manufacturer.Name在App的生命周期中保持不变.我们确实考虑过一个永远不会改变的"Code"列,并且这样的联接被查找:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId
WHERE m.Code = 'Nissan'
Run Code Online (Sandbox Code Playgroud)

我对此有点犹豫,因为它使用额外的连接和字符串比较,可以拼写错误.

无需在每个存储过程中声明变量,最好的方法是什么?

Aid*_*yan 4

我们通过几种方式做到了这一点:

  • 用户定义的函数,按名称返回“幻数”。
  • 使用 nchar(4) 列而不是 int 列,并得出稍微不那么难以理解的代码。所以 Nissan 将是“NISN”而不是 1。好一点。