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

时间:2015-02-10 11:02:30

标签: sql sql-server tsql sql-server-2008-r2

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

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

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

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

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

2 个答案:

答案 0 :(得分:15)

SQL Server具有内置功能,可将字符串值'true'转换为1,将'false'转换为0

运行此代码并查看:

DECLARE @someval BIT = 'true'

SELECT @someval

SET @someval = 'false'

SELECT @someval

<强>参考:

bit (Transact-SQL)

  

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

正如@hvd在注释中所述,声明在样本中不带引号的原因是基于在存储过程声明的参数赋值中可选的引号。

<强>参考:

Parameter Assignment to unquoted string

  

在存储过程定义中,可以为参数分配一个默认字符串值,该字符串值是一个未加引号的&#39;串。

     

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

答案 1 :(得分:1)

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