我使用以下脚本
创建了一个不可为空的用户定义数据类型CREATE TYPE ssn
FROM varchar(11) NOT NULL ;
但是用户定义的数据类型允许NULL
值。我正在使用SQL Server 2014 Developer Edition。如果我遗失了什么,请告诉我。
概念证明:
DECLARE @a ssn = NULL;
SELECT @a
答案 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
只关于列而不是变量的问题:
变量具有特定的数据类型(即类型和适用时的最大大小或精度/比例),但不会采用任何其他属性或约束,例如:
即使您能够将变量声明为您创建的用户定义数据类型(UDDT)(其中包括NOT NULL作为其定义的一部分),您也无法使用NOT NULL
声明变量:
DECLARE @Bob INT NOT NULL;
返回:
Msg 102,Level 15,State 1,Line 1
'NOT'附近的语法不正确。