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

use*_*570 8 sql sql-server arguments stored-procedures default

有什么区别:

CREATE PROCEDURE [dbo].[MyProcedure] 
                @MyArgument INT NULL
Run Code Online (Sandbox Code Playgroud)

CREATE PROCEDURE [dbo].[MyProcedure] 
                @MyArgument INT = NULL
Run Code Online (Sandbox Code Playgroud)

我用了第一个,在 SQL Server 2016 中运行良好,但 SQL Server 2012 不接受。两者都适用于 SQL Server 2016,我现在使用第二个没有问题。但是知道其中的区别会很有趣。

谢谢!

Mar*_*ith 12

他们不做同样的事情。第二个为调用者未指定的情况定义默认值。第一个没有。

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

虽然它没有被记录为“存储过程的 Transact-SQL 语法”中的语法支持,NULL但它看起来允许但拒绝NOT NULL并引发错误。

参数“@MyArgument”已声明为 NOT NULL。NOT NULL 参数仅支持本机编译的模块,内联表值函数除外。

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


kgz*_*dev 5

他们做不同的事情:

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

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