SQL别名数据类型

时间:2009-08-06 09:42:54

标签: sql sql-server sql-server-2005 alias-data-type

我正在开始一个新项目,我正在考虑在我的SQL Server 2005数据库中使用别名数据类型,用于公共表列。对于例如我将定义一个别名数据类型来保存对象的名称,如下所示:

  

创建类型adt_Name FROM   varchar(100)not null

然后使用它来定义表列,确保我的所有列共享完全相同的定义(长度,可空性,精度等)。

  1. 使用别名数据类型有什么好处?
  2. 使用别名数据类型有哪些缺点?
  3. 您会推荐哪些命名惯例?我在考虑adt_Xxx(adt =别名数据类型)。
  4. 为什么SQL Server 2005 Management Studio不允许我使用GUI中的别名数据类型。我只能通过SQL Scripts使用它们。 GUI不会在任何下拉框中列出它们 - 令人沮丧。
  5. 如何使用别名数据类型影响我的Linq to SQL模型?

4 个答案:

答案 0 :(得分:6)

<强>优点:

  • 可重复使用且可共享,ADT可在其创建的数据库中重复使用,如果您需要在所有数据库中创建它,则在模型数据库中创建它

  • 执行,ADT将强制执行其基本类型的特征,长度和可为空性,并可用于执行开发标准

  • 禁止隐式转换,ADT不能是CAST或CONVERTed

  • 简洁,与其他语言一样,ADT为开发和维护提供了简便性

  • 数据隐藏

<强>缺点:

  • 不可修改,无法直接修改ADT,您必须DROP并重新创建它们。请注意,您仍然可以将它们所在的表更改为另一个基本类型或ADT,然后DROP并重新创建它们,然后更改表(或者只创建一个新表以将其更改为)。

  • 没有工具,必须使用CREATE语句使用直接查询创建ADT(不推荐使用sp_addtype,不应使用)。

  • 不支持表变量

命名约定:

  • 'adt_'看起来会很好用

Linq to SQL:

  • 将这些类型视为查询中的基本类型,或创建相应的类型以使用

答案 1 :(得分:6)

我会反对它。我支持一些拥有使用它们的产品的顾客,他们是一个不变的PITA(脚踝疼痛)。

特别是,您不能在#temp表中使用它们,除非您还在TempDB中定义它们。由于每次重新启动SQL Server时TempDB都会重置,这意味着每次重新启动SQL Server时都必须重新定义它们。但这意味着启动程序必须在Master中并具有某些权限。由于Alias定义(实际上是术语中的UDT)可能会发生变化,这意味着DBA必须授予其他人编辑该过程的权利,这可能是一个安全问题。

哦,以免我忘记,如果你必须升级,迁移或重新安装你的服务器,你需要该proc的外部副本重新添加到Master,你需要记住这样做。 / p>

然后还有局限性:根据我的经验,开发人员希望使用这些“Alias”,因为他们认为如果需要,它将为他们提供更改定义的灵活性。它不会。持久性数据不像持久性代码,它没有那种灵活性,SQL Server根本不会帮助你。在你尝试这样做之后,你会很快得出结论,你从来不应该首先使用这些东西。

答案 2 :(得分:1)

类型一般都很好,但是我们的项目使用它有限,所以我可以回答#2 问题是“改变”。我们将类型TUrl开发为varchar(255),但过了一段时间后我们尝试更改为varchar(800)。对于工作数据库来说,这是不可能的。

我不知道使用别名数据类型的任何其他缺点。

答案 3 :(得分:1)

使用内置类型的IMO是一个巨大的痛苦。其他人已经给出了足够的理由。我正在使用C风格的宏。例如,在我的SQL 2000代码中,我在单独的文件macros.h中有以下行

#define WIDEST_CHAR VARCHAR(8000)

我会按如下方式使用它:

#include "macros.h"

(snip)

CREATE TABLE dbo.Comments(CommentID INT NOT NULL,
Comment WIDEST_CHAR,
...

并且预处理器将宏WIDEST_CHAR替换为VARCHAR(8000)。当我将系统迁移到2005时,我只是用

替换了宏定义
#define WIDEST_CHAR VARCHAR(MAX)

我完全定了。