【发布时间】: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