代码之家  ›  专栏  ›  技术社区  ›  Robert Wagner

清除SQL Server中的“幻数”

  •  5
  • Robert Wagner  · 技术社区  · 15 年前

    在代码中,可以指定一次全局可访问的常量/enums/etc,然后通过应用程序重用这些常量/enums/etc。这使人们能够使用有意义的名字,如“马自达”,而不是像“2”这样的数字。

    我们希望在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
    

    我们有一个限制,那就是我们不能依赖于制造商。名称在应用程序的生命周期中保持不变。我们确实考虑过拥有一个永不更改的列“code”,连接的查找方式如下:

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

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

    在不必声明每个存储过程中的变量的情况下,实现这一点的最佳方法是什么?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Aidan Ryan    15 年前

    我们有两种方法:

    • 按名称返回“幻数”的用户定义函数。
    • 使用nchar(4)列而不是int列,并得出稍微少一些难以理解的代码。所以日产将是“日产”,而不是1。稍微好一点。
        2
  •  1
  •   Kieveli    15 年前

    您不需要在数据库中存储数字。有一些数据库管理员仍然喜欢“自然键”的概念。它们不使用ID,只使用唯一定义制造商的自然键。这通常会导致多个主键。您可能必须使用“Mazda”“Canada”作为制造商的唯一标识符。

    就我个人而言,我不喜欢这种方法,并且更喜欢为存储在我的表中的每个可识别对象都有一个唯一的ID。这意味着创建一个新表,这是一个查找。2,“马扎达”。然后,您可以创建一个将“mazda”拉入数据库中有2个位置的视图,然后对该视图运行查询。从“V”车中选择“*”,制造商为“马自达”