SQL Server:UDT与UDDT之间的区别?

5
用户定义类型(UDT)和用户定义数据类型(UDDT)有什么区别?
4个回答

5
用户定义的数据类型 (UDDT)是纯 T-SQL 中基于 SQL Server 提供的 "本机" 类型(即除了地理、几何和层次结构 CLR 类型之外的所有类型)的简单别名。这些类型是为了方便在数据模型中保持一致性,其思想是避免在不同的表中以不同的方式定义相同的“属性”。
一个 UDDT 的例子就是将 SSN 定义为 CHAR(11)。或者也可以将 ClientID 定义为 INT用户定义类型 (UDT)是在 SQLCLR (即 NET/CLR 集成) 中编写的 "复杂" 类型,并且可以根据您的需要创建。它们是地理、几何和层次结构类型的基础。它们直接的表示形式是 VARBINARY,但通常您不直接与它们交互。就像这三个 CLR 类型和 XML 数据类型一样,您通过在其中定义的方法和属性与 UDT 交互。它们可以具有静态和实例化的方法和属性。您甚至可以重载比较运算符,以便在使用 =< 或您决定重载的任何其他情况下进行特殊处理。
一个例子可以是 Array/Collection。您在内部存储一个集合,并公开诸如 .Add().GetByIndex() 等方法。您可以公开属性,如 .Length 等。因此,您可以这样声明它:
DECLARE @VarName SchemaName.TypeName;

您可以通过属性和方法来更新它:
SET @VarName = @VarName.Method(@var1, 'LiteralValue');

你可以通过属性和方法获取它的值:
SELECT @VarName.AnotherMethod(), @VarName.SomeProperty;

如果你想看一些展示这些变化的示例,并且可以进行试玩,你可以下载我写的免费版本的SQL#库(但是类型是免费的),其中包括三个用户定义类型(UDT),其中一个是Type_HashTable,在手册中有一些很好的示例。你可以在手册的第178页(PDF文件中的第186页)上找到Type_HashTable的信息。


还有用户定义表类型,它们是使用表值参数所必需的(但不是表值变量):CREATE TYPE [name] AS TABLE ( ... ) - Dai

1

接受的答案让我受益匪浅,但这是我向外行人解释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可以提高可读性并强制执行标准。在运行于Entity Framework的应用程序中应用UDT可以通过提供批量传输(而不是逐行传输)来提高应用程序与服务器之间的性能。

UDT 可以用于在 Entity Framework 上运行的应用程序中,通过提供批量传输(而不是逐行传输),从而改善应用程序和服务器之间的性能,从而提高性能。 尽管 Entity Framework(和 EF Core)支持表值参数的 UDT,但实际上它是从更低级别的 ADO.NET 层继承下来的(该层也支持 UDT)。 实际上,EF 对 UDT 的支持有些有限,就我所知,您也不能将 UDT 绑定到实际的实体类型上(因为 UDT 不可避免地是实体的表设计的子集,例如没有计算列、时间表列等)。 - Dai

0

UDTs(用户定义类型):UDTs可用于数据库对象的定义,Transact-SQL批处理中的变量,函数和存储过程中,以及函数和存储过程中的参数。

UDDTs(用户定义数据类型):当多个表必须在列中存储相同类型的数据并且您必须确保这些列具有完全相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可以基于char数据类型创建名为postal_code的用户定义数据类型。


我知道用户定义的数据类型 (UDDTs) 本质上是完整 SQL 类型规范的别名,但我还不太明白用户定义的类型 (UDTs) 是什么。你能否提供一个例子?MSDN 页面在这种情况下并不特别有帮助。 - Benjin
UDTs是在.NET Framework中创建的,然后在将程序集注册到MS SQL之后,我们可以像使用普通数据类型一样使用这些类型,例如:CREATE TABLE table (colName udtType); 这个资源可能会有帮助:CLR用户定义类型 - Khalid Amin

-1

这是两个不同名称的相同概念。据我所知,UDT 自 SQL 2005 年开始使用,而 UDDT 则可以追溯到 SQL 2000。


1
它们绝对不一样。一个是别名,另一个是...其他什么,但我不知道是什么。 - Benjin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接