为什么要将SQL Server位设置为";假;在存储过程定义中是否有效?

为什么要将SQL Server位设置为";假;在存储过程定义中是否有效?,sql,sql-server,tsql,sql-server-2008-r2,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。SQL Server具有内置功能,可以将字符串值'true'转换为1

在SQL Server中,位通常用于表示true和false,但不能直接将true和false赋值给它们,因为它们必须是1或0

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

CREATE PROCEDURE TestProcedure
@parameter bit = false
AS
BEGIN
...
END
为什么它是有效的?特别是当在存储过程的主体中将位设置为false时


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

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

运行此代码并查看:

DECLARE @someval BIT = 'true'

SELECT @someval

SET @someval = 'false'

SELECT @someval
参考资料:

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

正如@hvd在注释中所述,声明在示例中不使用引号的原因是,引号在存储过程声明的参数赋值中是可选的

参考资料:

在存储过程定义中,可以为参数指定一个默认字符串值,该值为“无引号”字符串

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


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

当你执行它时会发生什么?它执行得很好。如果您选择该参数,它确实设置为false。SQL 2008 R2编辑的主要问题。这可能是一个很好的部分答案。但是,它没有解释未加引号的
false
如何在OP中工作,原因是在少数情况下,一种是存储过程参数的默认值,引号是可选的。MS对“参数赋值到无引号字符串”的连接项的响应非常有趣。我们会的,但是……遗产。今天,我在一些开发代码中看到了这种用法,我很想知道为什么它没有出现错误。谢谢你的链接