SQL Server 2014中用户定义的数据类型问题

时间:2016-01-31 12:28:13

标签: sql-server

我使用以下脚本

创建了一个不可为空的用户定义数据类型
CREATE TYPE ssn
FROM varchar(11) NOT NULL ;

但是用户定义的数据类型允许NULL值。我正在使用SQL Server 2014 Developer Edition。如果我遗失了什么,请告诉我。

概念证明:

DECLARE @a ssn = NULL; 
SELECT @a

3 个答案:

答案 0 :(得分:3)

NOT NULL约束仅适用于将类型用作表中列的数据类型而不是变量的值。以下方法无效:

CREATE TYPE ssn
FROM varchar(11) NOT NULL;
create table foo (id integer primary key, foo_ssn ssn);

insert into foo values (1, null); 

插入结果

  

无法将值NULL插入列'foo_ssn',

答案 1 :(得分:0)

我想这是由于ANSI_WARNINGS

  

设置为ON时,除零和算术溢出错误   导致语句回滚并出现错误消息   产生

但是SET/SELECT

  

传递存储中的参数时,不遵守ANSI_WARNINGS   过程,用户定义的函数,或声明和设置时   批处理语句中的变量。

例如,如果变量定义为char(3),然后设置为大于三个字符的值,则数据将被截断为定义的大小,INSERT或UPDATE语句将成功。

DECLARE @var char(3)
SET @var = 'ABCDEF'
SELECT @var --ABC

即使我们插入超过3个字符的

,上述查询也能正常工作

当您尝试在表中执行相同的操作时

CREATE table test(colu CHAR(3))
INSERT INTO test VALUES('ABCDEF')

会失败,说

  

消息8152,级别16,状态14,行9字符串或二进制数据将是   截断。

答案 2 :(得分:0)

要扩展@a_horse_with_no_name columnForeground关于NOT NULL只关于列而不是变量的问题:

变量具有特定的数据类型(即类型和适用时的最大大小或精度/比例),但不会采用任何其他属性或约束,例如:

  • NOT NULL
  • IDENTITY
  • 整理
  • DEFAULT CONSTRAINT
  • ROWGUIDCOL
  • 稀疏

即使您能够将变量声明为您创建的用户定义数据类型(UDDT)(其中包括NOT NULL作为其定义的一部分),您也无法使用NOT NULL声明变量:

DECLARE @Bob INT NOT NULL;

返回:

  

Msg 102,Level 15,State 1,Line 1
  'NOT'附近的语法不正确。