从字符串值成功分配了Int变量,无需进行显式转换

时间:2018-11-30 21:45:00

标签: sql-server tsql

我很好奇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

我进行了一次搜索,以查找有关此行为的某种文档,但我所能找到的只是有关如何使用强制转换和转换功能的指南。

任何人都对如何/为什么发生有很好的参考或解释?

1 个答案:

答案 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