"SYSNAME
不可能是NULL
“只是不正确。当链接问题的答案说它相当于NVARCHAR(128) NOT NULL
as a default——然后有效地only在列定义中。比较:
-- When not specified, columns are NULL
SET ANSI_NULL_DFLT_ON ON
-- Works
CREATE TABLE T(N NVARCHAR(128)); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO
-- When not specified, columns are NOT NULL
SET ANSI_NULL_DFLT_ON OFF
-- Error: can't insert NULL
CREATE TABLE T(N NVARCHAR(128)); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO
现在尝试同样的方法SYSNAME
:
-- When not specified, columns are NULL
SET ANSI_NULL_DFLT_ON ON
-- Error: SYSNAME is NOT NULL, regardless of defaults
CREATE TABLE T(N SYSNAME); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO
但这并不意味着SYSNAME
不可能是NULL
,我们所要做的就是说它可能是:
-- Works
CREATE TABLE T(N SYSNAME NULL); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO
在几乎所有其他使用类型的上下文中(变量、存储过程参数),我们无法指定NULL
or NOT NULL
and NULL
值总是被允许的,所以这NOT NULL
元数据很少相关。上面的代码使用常规表并非偶然:如果您对表变量尝试相同的操作,您会发现ANSI_NULL_DFLT_ON
被忽略并且NULL
如果未指定,则始终是列的默认值,因此唯一相关的情况是:
-- Can't insert NULL
DECLARE @T TABLE (N SYSNAME); INSERT @T DEFAULT VALUES; SELECT * FROM T@
GO
-- OK
DECLARE @T TABLE (N SYSNAME NULL); INSERT @T DEFAULT VALUES; SELECT * FROM @T
GO