我正在开始一个新项目,我正在考虑在我的SQL Server 2005数据库中使用别名数据类型,用于公共表列。对于例如我将定义一个别名数据类型来保存对象的名称,如下所示:
创建类型adt_Name FROM varchar(100)not null
然后使用它来定义表列,确保我的所有列共享完全相同的定义(长度,可空性,精度等)。
答案 0 :(得分:6)
<强>优点:强>
可重复使用且可共享,ADT可在其创建的数据库中重复使用,如果您需要在所有数据库中创建它,则在模型数据库中创建它
执行,ADT将强制执行其基本类型的特征,长度和可为空性,并可用于执行开发标准
禁止隐式转换,ADT不能是CAST或CONVERTed
简洁,与其他语言一样,ADT为开发和维护提供了简便性
数据隐藏
<强>缺点:强>
不可修改,无法直接修改ADT,您必须DROP并重新创建它们。请注意,您仍然可以将它们所在的表更改为另一个基本类型或ADT,然后DROP并重新创建它们,然后更改表(或者只创建一个新表以将其更改为)。
没有工具,必须使用CREATE语句使用直接查询创建ADT(不推荐使用sp_addtype,不应使用)。
不支持表变量
命名约定:
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)
我完全定了。