【发布时间】:2019-02-16 11:59:17
【问题描述】:
我读到了sysname cannot be null,但是在系统过程sp_grantdbaccess 的定义中,我看到将null 分配给了过程的一个参数(如果我没看错的话)。这怎么可能?
ALTER PROCEDURE [sys].[sp_grantdbaccess]
@loginame sysname,
@name_in_db sysname = NULL OUT
【问题讨论】:
-
如果您阅读了您提供的链接中的完整答案,您将看到
SYSNAMENOT NULL是默认值,但它也可以被覆盖,这实际上就是这里发生的事情。 -
在某些情况下会忽略类型的默认可空性,存储过程参数就是其中之一。变量是另一个:
DECLARE @n SYSNAME可以正常工作,并且它总是会生成一个初始值为NULL的变量。对于存储过程参数,重要的是参数是否被提供,而不是它的值——NULL总是被允许的。sp_grantdbaccess @loginame=NULL产生错误只是因为sp_grantdbaccess明确检查(通过sp_validname)——引擎不会阻止分配NULL。 -
@RBarryYoung - 接受的答案引用官方文档的话说“sysname 是系统提供的用户定义数据类型,在功能上等同于 nvarchar(128),但它不可为空”与后面的评论冲突,即 null 只是默认值,这就是我问这个问题的原因 - 我认为官方文档优先于答案评论。
-
谢谢@JeroenMostert - 从你的解释中我推断出引用的文档可能意味着数据类型 sysname 的列可能不会以空值持久化 - 而不是意味着该类型的变量可能不会在过程等范围内为空。
-
这也不对。我最好写一个答案...
标签: sql-server stored-procedures sqldatatypes