【问题标题】:Stored Procedure argument "NULL" or "= NULL"存储过程参数“NULL”或“= NULL”
【发布时间】:2019-12-20 08:32:41
【问题描述】:
有什么区别:
CREATE PROCEDURE [dbo].[MyProcedure]
@MyArgument INT NULL
和
CREATE PROCEDURE [dbo].[MyProcedure]
@MyArgument INT = NULL
我使用了第一个,它在 SQL Server 2016 中运行良好。但是 SQL Server 2012 不接受它。
两者都适用于 SQL Server 2016,我现在使用第二个没有问题。
但是知道其中的区别会很有趣。
谢谢!
【问题讨论】:
标签:
sql
sql-server
stored-procedures
arguments
default
【解决方案1】:
他们不做同样的事情。第二个为调用者未指定一个的情况定义一个默认值。第一个没有。
“本机编译存储过程的 Transact-SQL 语法”grammar 允许将参数数据类型声明为允许 NULL 或 NOT NULL。这是为 Hekaton(内存优化表)引入的。
尽管“存储过程的 Transact-SQL 语法”中的语法没有记录为支持它,但它看起来允许 NULL 但拒绝 NOT NULL 并引发错误。
参数“@MyArgument”已声明为 NOT NULL。非空
仅本地编译的模块支持参数,除了
用于内联表值函数。
明确指定NULL 没有任何价值——这是默认选项,也是唯一的选项。常规存储过程没有声明性语法来指示参数必须是NOT NULL。
【解决方案2】:
他们做不同的事情:
1) @MyArgument INT NULL - NULL 值允许 用于参数@MyArgument
2) @MyArgument INT = NULL - 参数@MyArgument的默认值为NULL