Sql server 从字符串值成功分配Int变量,无需显式转换

Sql server 从字符串值成功分配Int变量,无需显式转换,sql-server,tsql,Sql Server,Tsql,我很好奇SQL Server是如何成功地将整变量赋值为字符串的。我希望@Int的赋值会导致转换失败,但其工作原理与@Int的赋值相同 DECLARE @Int INT = CAST('2' AS INT) SELECT @Int DECLARE @Int1 INT = '2' SELECT @Int1 此外,如果将int变量指定给空字符串,则会导致变量的值为0 DECLARE @Int3 INT = '' SELECT @Int3 我搜索了一些关于这种行为的文档,但我能找到的只是关于如何使

我很好奇SQL Server是如何成功地将整变量赋值为字符串的。我希望
@Int
的赋值会导致转换失败,但其工作原理与
@Int
的赋值相同

DECLARE @Int INT = CAST('2' AS INT)
SELECT @Int

DECLARE @Int1 INT = '2'
SELECT @Int1
此外,如果将int变量指定给空字符串,则会导致变量的值为0

DECLARE @Int3 INT = ''
SELECT @Int3
我搜索了一些关于这种行为的文档,但我能找到的只是关于如何使用cast和convert函数的指南


是否有人对这种情况的发生方式/原因有很好的参考或解释?

每当您尝试分配、组合或比较不同类型的值时,如果其中一个可以隐式转换为另一个,SQL Server都会隐式转换数据类型

这一点在以下文件中有很好的记录:

可以在以下场景中转换数据类型:

  • 当一个对象的数据移动到另一个对象的数据、与另一个对象的数据进行比较或与另一个对象的数据进行组合时,可能必须将数据从一个对象的数据类型转换为另一个对象的数据类型

  • 当Transact-SQL结果列、返回代码或输出参数中的数据移动到程序变量中时,必须将数据从SQL Server系统数据类型转换为该变量的数据类型。(与问题无关)

在这下面有一段题为隐式和显式转换的内容,其中指出:

可以隐式或显式转换数据类型

隐式转换对用户不可见。SQL Server会自动将数据从一种数据类型转换为另一种数据类型。例如,将smallint与int进行比较时,smallint会在比较进行之前隐式转换为int

在本页的下一页,有一个表显示了所有可能的数据类型转换,包括显式转换和隐式转换

还有一个名为的页面,记录了当隐式转换是计算结果时,将隐式转换为什么类型。例如,
1+'2'
将产生
3
,因为整数的优先级高于字符:

DECLARE @Int int = 1,
        @Char char(1) = '2'

SELECT @int + @Char As ImplicitConversionDemo
结果:

ImplicitConversionDemo
3