存储过程参数“ NULL”或“ = NULL”

时间:2019-12-20 08:32:41

标签: sql sql-server stored-procedures arguments default

两者之间有什么区别

CREATE PROCEDURE [dbo].[MyProcedure] 
                @MyArgument INT NULL

CREATE PROCEDURE [dbo].[MyProcedure] 
                @MyArgument INT = NULL

我使用了第一个,它在SQL Server 2016中运行良好。但是SQL Server 2012不接受它。 两者都可以在SQL Server 2016上运行,并且我现在正在使用第二个没有问题。 但是了解它们之间的差异将很有趣。

谢谢!

2 个答案:

答案 0 :(得分:8)

他们做的不一样。第二个参数定义了调用方未指定默认值的默认值。第一个没有。

“本机编译存储过程的Transact-SQL语法” grammar允许将参数数据类型声明为允许NULLNOT NULL。这是为Hekaton(内存优化表)引入的。

尽管“存储过程的Transact-SQL语法”中没有为该语法提供文档支持,但看起来它允许NULL但不接受NOT NULL并抛出错误。

  

参数'@MyArgument'已声明为NOT NULL。非空   仅本地编译模块支持参数,除了   用于内联表值函数。

显式指定NULL没有任何价值-这是默认且唯一的选项。常规存储过程没有声明性语法来表明参数必须为NOT NULL

答案 1 :(得分:3)

他们做不同的事情:

1)@MyArgument INT NULL-参数@MyArgument允许 NULL值

2)@MyArgument INT = NULL-参数@MyArgument的默认值为空