为什么在存储过程定义中将 SQL 服务器位设置为 "false" 有效?

Why is Setting a SQL Server Bit to "false" in a stored procedure definition valid?

在SQL 服务器中经常使用位来表示真假,但是您不能按字面意思为它们分配真假,它必须是 1 或 0。

我最近偶然发现了以下代码:

CREATE PROCEDURE TestProcedure
@parameter bit = false
AS
BEGIN
...
END

为什么有效?尤其是在存储过程的主体中将某个位设置为 false 时则不然。

如果你用 select 查询参数,它确实设置为 0,代表 false。

SQL 服务器具有将字符串值 'true' 转换为 1 以及将 'false' 转换为 0:

的内置功能

运行这段代码见:

DECLARE @someval BIT = 'true'

SELECT @someval

SET @someval = 'false'

SELECT @someval

参考:

bit (Transact-SQL)

The string values TRUE and FALSE can be converted to bit values: TRUE is converted to 1 and FALSE is converted to 0.

正如@hvd 在评论中指出的那样,声明在示例中没有引号的情况下起作用的原因是基于引号在存储过程声明的参数分配中是可选的。

参考:

Parameter Assignment to unquoted string

In a stored procedure definition, a parameter can be assigned a default string value that is an 'unquoted' string.

...this is very widely used legacy behavior that needs to be maintained for compatibility reasons. The same behavior can be seen when passing parameters in an exec statement.

除过程参数声明外,您不能在任何地方将 false 赋给位变量 - 在该区域 SQL 知道您的意思与 0 相同,但在过程实际文本中则不然。仅在参数中。