您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_addtype

说明

创建用户定义的数据类型

语法


sp_addtype <typename>, 
	<phystype> [(<length>) | (<precision> [, <scale>])]
	[, "identity" | <nulltype>]

参数

typename

是用户定义的数据类型的名称。类型名必须符合标识符的规则并且在每个数据库中必须是唯一的。

phystype

是物理数据类型或 SAP ASE 服务器提供的数据类型,该数据类型是用户定义的数据类型的基础。您可以指定除 timestamp 之外的任何 SAP ASE 数据类型。

The char、varchar、unichar、univarchar、nchar、nvarchar、binary 和 varbinary 数据类型要求将<长度>加以括号。如果未提供长度,则 SAP ASE 将使用 1 个字符的缺省长度。

float 数据类型要求将二进制 加上小括号。如果未提供精度,SAP ASE 服务器将使用所用平台的缺省精度。

numeric 和 decimal 数据类型要求将十进制 <precision><scale>,用括号括起来并用逗号分隔。如果未提供精度和标度,则 SAP ASE 服务器将使用缺省精度 18 和缺省标度 0。

用单引号或双引号将包含标点符号(例如小括号或逗号)的物理类型引起来。

identity

指示用户定义的数据类型具有 IDENTITY 属性。用单引号或双引号将 identity 关键字引起来。您只能为标度为 0 的 numeric 数据类型指定 IDENTITY 属性。

IDENTITY 列存储由 SAP ASE 服务器生成的序列号,例如发票编号或职员编号。IDENTITY 列的值唯一地标识表中的每一行。IDENTITY 列不能进行更新,也不允许空值。

nulltype

指示用户定义的数据类型如何处理空值条目。此参数可接受的值包括null、NULL、nonull、NONULL、"not null" 和 "NOT NULL"。必须用单引号或双引号将包括空格的任何 <nulltype> 引起来。

如果既省略了 IDENTITY 属性又省略了 <nulltype>,则 SAP ASE 服务器将使用为数据库定义的空值模式创建数据类型。缺省情况下,未指定 <nulltype> 的数据类型将被创建为 NOT NULL(也就是说,不允许空值并且需要明确输入)。为符合 SQL 标准,使用 sp_dboption 系统过程将 allow nulls by default 选项设置为 true。这会将数据库的空值模式更改为 NULL。

示例

示例 1

创建一个名为 ssn 的用户定义的数据类型,该数据类型将用于保存社会保险号的列。由于未指定 参数,SAP ASE 服务器将使用数据库的缺省空值模式创建数据类型。请注意,varchar(11) 引在引号中,这是因为它包含标点符号(小括号):


sp_addtype ssn, "varchar(11)"

示例 2

创建一个名为 birthday 的用户定义的数据类型,该数据类型允许使用空值:


sp_addtype birthday, "datetime", null 

示例 3

创建一个名为 temp52 的用户定义的数据类型,该数据类型用于存储温度(最多 5 个有效位数,其中小数点右侧 2 位):


sp_addtype temp52, "numeric(5,2)"

示例 4

创建一个名为 row_id 的用户定义的数据类型,该数据类型具有 IDENTITY 属性,将用作唯一行标识符。使用此数据类型创建的列存储长度最多为 10 位的系统生成的值:


sp_addtype "row_id", "numeric(10,0)", "identity"

示例 5

创建具有 sysname 基础类型的用户定义的数据类型:


sp_addtype systype, sysname

虽然您不能在 create table、alter table 或 create procedure 语句中使用 sysname 数据类型,但却可以使用基于 sysname 的用户定义的数据类型。

###用法

  • sp_addtype 创建用户定义的数据类型并将其添加到 systypes 系统表中。在创建了用户定义的数据类型之后,您可以在 create table 和 alter table 语句中使用该数据类型,并为其绑定缺省值和规则。

  • 根据 SAP ASE 提供的数据类型之一建立每个用户定义的数据类型,适当地指定长度或精度和标度。您不能替换 create table 或 alter table 语句中的长度、精度或标度。

  • 用户定义的数据类型名在数据库中必须是唯一的,但具有不同名称的用户定义的数据类型可以具有相同的定义。

  • 如果将 nchar 或 nvarchar 指定为 ,使用该新类型创建的列的最大长度是添加类型时 sp_addtype 中指定的长度乘以 <@@ncharsize> 的值。

  • 如果将 unichar 或 univarchar 指定为 ,使用该新类型创建的列的最大长度是添加类型时 sp_addtype 中指定的长度乘以值 2。

  • 每个系统类型都具有层次,存储在 systypes 系统表中。用户定义的数据类型与其基础物理类型具有相同的数据类型层次。在混合型表达式中,所有类型都会被转换为普通类型,即具有最低层次的类型。

    使用以下查询列出数据库中每个系统提供的和用户定义的类型的层次:

    
    select name, hierarchy
    from systypes
    order by hierarchy
    

  • 如果将用户定义的数据类型定义为具有 IDENTITY 属性,则从该数据类型创建的所有列都是 IDENTITY 列。您可以在 create 或 alter table 语句中指定 IDENTITY、NOT NULL 或一个都不指定。按照以下三种不同的方法从具有 IDENTITY 属性的用户定义的数据类型创建 IDENTITY 列:

    
    create table new_table (id_col IdentType)
    
    create table new_table (id_col IdentType identity)
    
    create table new_table (id_col IdentType not null)
    

    当使用 create table 或 alter table 语句创建列时,您可以替换通过 sp_addtype 系统过程指定的空值类型:

  • 被指定为 NOT NULL 的类型可用于创建 NULL 或 IDENTITY 列。

  • 被指定为 NULL 的类型可用于创建 NOT NULL 列,但不能创建 IDENTITY 列。

    注意

    如果尝试从 IDENTITY 类型创建空列,则 create或 alter table 语句将失败。