sql - 而不是抛出错误类型 block 执行成功

标签 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)

我创建了一个 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”

提前致谢

最佳答案

这是reason

The null_type parameter only defines the default nullability for this data type. If nullability is explicitly defined when the alias data type is used during table creation, it takes precedence over the defined nullability.

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

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

关于sql - 而不是抛出错误类型 block 执行成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44492620/

相关文章:

sql - Snowflake 使用 flatten 进行数组展平返回未知函数

php - SQL SELECT id WHERE 电子邮件相同

mysql - 确保表构建正确

mysql - 使用左连接的 SQL 查询从特定日期开始按降序获取行

SQL:固定行和行号计算

sql - 查询以选择并组合表中的最高值和最低值

mysql - MariaDB:从一个表中的一列中选择不在另一个表中另一列的子集中的字段

arrays - SQL Server 2016 JSON : Select array of strings instead of array of objects

sql-server - 在用户的默认数据库脱机后,如何重新获得对 MS SQL Server 的访问权限?

sql - 使用 EXISTS 时关键字附近的语法不正确