用户定义类型(UDT)和用户定义数据类型(UDDT)之间有什么区别?
用户定义数据类型(UDDT)是纯T-SQL中的简单别名,基于SQL Server附带的“本机”类型(即除了CLR类型的地理,几何和层次结构之外的所有类型)。这些是为了方便在数据模型中保持一致性,这个想法是避免在以不同方式定义的表之间具有相同的“属性”。
UDDT的一个例子是将SSN
定义为CHAR(11)
。或者也许ClientID
将是INT
。
用户定义类型(UDT)是用SQLCLR(即NET / CLR集成)编写的“复杂”类型,是您创建它们的任何类型。它们是地理,几何和层次结构类型所基于的。它们的直接表示是VARBINARY,但是你不直接与它们交互(通常不是)。与那些3种CLR类型和XML数据类型一样,您可以通过UDT中定义的方法和属性与UDT进行交互。它们可以同时具有静态和基于实例的方法和属性。您甚至可以覆盖与它们进行比较的运算符,以便在=
,<
或您决定覆盖的任何内容中使用时可以进行特殊处理。
一个例子可以是数组/集合。你在内部存储一个集合,并为.Add()
,.GetByIndex()
等公开方法。你可以公开.Length
等属性。所以你会声明它像:
DECLARE @VarName SchemaName.TypeName;
您可以通过属性和方法更新它:
SET @VarName = @VarName.Method(@var1, 'LiteralValue');
您可以通过属性和方法从中获取值:
SELECT @VarName.AnotherMethod(), @VarName.SomeProperty;
如果你想要显示一些这些变化的例子,你甚至可以玩,你可以下载免费版的SQL#库(我写的,但类型是免费的),它带有三个UDT,其中一个是Type_HashTable在手册中有一些很好的例子。您可以从手册的第178页开始找到Type_HashTable的信息(PDF中的第186页)。
接受的答案教育了我,但这就是我如何向不熟悉的人解释UDT与UDDT:
UDDT将基本类型自定义为“新”类型(请注意,在下面的示例中,CONTACTNAME和EMAILADDRESS之间只有长度不同)。
CREATE TYPE CONTACTNAME FROM NVARCHAR(130) NOT NULL
CREATE TYPE EMAILADDRESS FROM NVARCHAR(50) NOT NULL
CREATE TYPE BIRTHDAY FROM DATE NULL
CREATE TYPE BIRTHTIME FROM DATETIME NULL
UDT是一个“数据结构”,创建如下:
CREATE TYPE dbo.contactInformation
AS TABLE
(
FileID UNIQUEIDENTIFIER,
[Name] CONTACTNAME,
[FirstName] NVARCHAR(20),
[EMail] EMAILADDRESS
);
GO
根据我的经验,UDDT可以提高可读性,并强制执行标准。 UDT可以应用于在Entity Framework上运行的应用程序,通过提供批量传输(而不是逐行传输)来提高应用程序和服务器之间的性能。
这些是具有两个不同名称的相同概念。自SQL 2005以来,AFAIK,UDT一直在使用,UDDT又回到了SQL 2000