【问题标题】:Instead of throwing an error type block executed successfully而不是抛出一个成功执行的错误类型块
【发布时间】:2017-06-12 06:23:40
【问题描述】:

最近我读到了 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) 不为 null 的类型 ssn,并运行了上述一个逻辑,它成功执行

根据我的假设,它应该会引发错误。

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

编辑

根据建议,我已将此 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)
    )

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

提前致谢

【问题讨论】:

  • 您预计会遇到哪个错误?
  • @GiorgosBetsos 我希望空值不能分配给 er 变量
  • 在 SQL Server 中,我们可以通过 初始化 declare 和 variable(默认为 NULL)。所以它使UDT 的NOT NULL 属性无效。不知道为什么它允许在 UDT 中提及 NOT NULL 属性。
  • DECLARE @er ssn; 与 DECLARE @er ssn = NULL 相同。可以通过删除 Create 和 Insert 语句来简化问题。声明后只需Select @er。它将是NULL
  • 感谢 Prdp 的快速回复,但是我们的 UDT 允许创建不为空的数据类型,因此据我了解,当我们继承此数据类型时,变量不应允许为空

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


【解决方案1】:

这里是reason

null_type 参数只定义了这个的默认可空性 数据类型。如果在别名数据时显式定义可空性 type 在创建表时使用,它优先于 定义的可空性。

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

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

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2016-02-24
    相关资源
    最近更新 更多