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

Thr*_*gic 10 sql t-sql sql-server sql-server-2008-r2

在SQL Server中经常使用位来表示true和false,但是您不能逐字地为它们分配true和false,它必须是1或0.

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

CREATE PROCEDURE TestProcedure
@parameter bit = false
AS
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)

为什么有效?特别是当在存储过程的主体中将位设置为false时不是.

如果使用select查询参数,则确实将其设置为0,表示false.

Tan*_*ner 15

SQL Server有内置的功能为字符串值转换'true'1'false'0:

运行此代码并查看:

DECLARE @someval BIT = 'true'

SELECT @someval

SET @someval = 'false'

SELECT @someval
Run Code Online (Sandbox Code Playgroud)

参考:

位(Transact-SQL)

字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0.

正如@hvd在注释中所述,声明在样本中没有引号的情况下工作的原因是基于引用在存储过程声明的参数赋值中是可选的.

参考:

参数分配给不带引号的字符串

在存储过程定义中,可以为参数分配一个默认字符串值,即"未加引号"字符串.

...这是非常广泛使用的遗留行为,出于兼容性原因需要维护.在exec语句中传递参数时可以看到相同的行为.

  • 原因在于,在一些罕见的上下文中,一个是存储过程参数的默认值,引用是可选的.[不带引号的字符串的参数分配](https://connect.microsoft.com/SQLServer/feedback/details/278399/parameter-assignment-to-unquoted-string) (2认同)