我很好奇SQL Server如何在将整数变量值分配为字符串时成功地提供它们。我希望@Int1
的分配会导致转换失败,但其工作原理与@Int
的分配相同。
DECLARE @Int INT = CAST('2' AS INT)
SELECT @Int
DECLARE @Int1 INT = '2'
SELECT @Int1
此外,如果将int变量分配给空字符串,则会导致该变量的值为0。
DECLARE @Int3 INT = ''
SELECT @Int3
我进行了一次搜索,以查找有关此行为的某种文档,但我所能找到的只是有关如何使用强制转换和转换功能的指南。
任何人都对如何/为什么发生有很好的参考或解释?
答案 0 :(得分:1)
只要尝试将其中一种可以隐式转换为另一种,SQL Server就会在您尝试分配,组合或比较不同类型的值时隐式转换数据类型。
Data type conversion (Database Engine)中对此进行了详细记录:
在以下情况下可以转换数据类型:
- p>
当将一个对象的数据移动到另一对象的数据或与之比较时,可能必须将数据从一个对象的数据类型转换为另一对象的数据类型。
将来自Transact-SQL结果列,返回代码或输出参数的数据移入程序变量时,必须将数据从SQL Server系统数据类型转换为变量的数据类型。 (对该问题不重要)
在此正下方有一个标题为隐式和显式转换的段落,其中指出:
数据类型可以隐式或显式转换。
隐式转换对用户不可见。 SQL Server自动将数据从一种数据类型转换为另一种数据类型。例如,当将smallint与int比较时,在进行比较之前,将smallint隐式转换为int。
此页面下还有一个表格,显示所有可能的数据类型转换-显式和隐式。
还有一个名为Data type precedence (Transact-SQL)的页面,记录了当隐式转换是计算结果时,哪种类型将隐式转换为哪种类型-例如,1 + '2'
将与{{1 }},因为整数的优先级高于char:
3
结果:
DECLARE @Int int = 1,
@Char char(1) = '2'
SELECT @int + @Char As ImplicitConversionDemo