2017-06-12 128 views
7

最近我已阅读关于UDT。我创建了一个类型,但是我遇到了一个问题。请看以下而不是抛出错误类型块成功执行

---drop type ssn 
CREATE TYPE ssn 
FROM VARCHAR(11) NOT NULL; 

DECLARE @er ssn; 

IF Object_id('TEMPDB.DBO.#ter', 'U') IS NOT NULL 
    DROP TABLE #ter; 

CREATE TABLE #ter (
    PERIOD_SID INT 
    ,PERIOD_QUAR VARCHAR(10) PRIMARY KEY (PERIOD_SID) 
    ) 

INSERT INTO #ter (
    PERIOD_SID 
    ,PERIOD_QUAR 
    ) 
SELECT * 
FROM (
    VALUES (
     (1) 
     ,(@er) 
     ) 
    ) V(p, q) 

我创建VARCHAR(11)为ssn一种不为空,跑到上面的一个逻辑,它成功地执行 enter image description here

按我的设想,应该抛出错误。

我需要知道为什么上述逻辑成功运行。

编辑

按照建议,我已经加入此UDT在AQL服务器列,因为在Oracle中,我们可以创建类似收藏一列UDT

IF Object_id('TEMPDB.DBO.#ter1', 'U') IS NOT NULL 
    DROP TABLE #ter1; 

CREATE TABLE #ter1 (
    PERIOD_SID INT 
    ,PERIOD_QUAR ssn PRIMARY KEY (PERIOD_SID) 
    ) 

enter image description here

创建表时遇到错误,表示没有此类数据类型“ssn”

预先感谢

+0

你期望得到哪个错误? –

+0

@GiorgosBetsos我希望像空值不能分配给变量 – Smart003

+1

在SQL Server中,我们可以'声明'变量'*初始化*它(默认为'NULL')。所以它会使'UDT'的NOT NULL属性无效。不知道为什么它允许在UDT中提及NOT NULL属性。 –

回答

1

这里是reason

的null_type参数只定义的默认为空此 数据类型。如果在创建表格时使用别名数据 类型时明确定义了可空性,则优先于定义的可空性的 。

这取自sp_addtype,但它应该与CREATE TYPE相同。 sp_addtype也用于创建用户定义的数据类型

在您的情况下,我们无法创建一个不接受NOT NULL值的变量。所以我认为该属性被覆盖