而不是抛出错误类型块成功执行

时间:2017-06-12 06:23:41

标签: sql sql-server sql-server-2012

最近我读到了关于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)

我创建了一个类型为ssn,varchar(11)不为null,并运行上面的一个逻辑,它执行成功 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"

提前致谢

1 个答案:

答案 0 :(得分:1)

以下是reason

  

null_type参数仅定义此的默认可为空性   数据类型。如果在别名数据中明确定义了为空性   在表创建期间使用type,它优先于   定义了可空性。

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

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