在CONCAT中将varchar值转换为int时转换失败

时间:2019-07-17 12:56:46

标签: sql sql-server sql-server-2016

运行此查询:

SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.'+BE_Numero_carnet) AS varchar(1000)) AS chemin 
FROM ...

导致错误:

  

第1级状态16消息245
  转换varchar值'\ BE'时转换失败。数据类型为int。

2 个答案:

答案 0 :(得分:1)

不要使用+

SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.', BE_Numero_carnet) AS     varchar(1000)) AS chemin 
FROM ...

答案 1 :(得分:1)

codeulike's answer是正确的。
这里的答案是为了解释为什么它是正确的。

+运算符在SQL Server中具有双重含义。
从某种意义上说,它是string concatenation运算符。
换句话说,它是arithmetic addition运算符。

考虑以下代码:

DECLARE @A int = 1, @B int = 2,
        @X char(1) = '1', @Y char(1) = '2';

SELECT  @A + @B As Addition,
        @X + @Y As Concatenation

可以预期的结果是:

Addition    Concatenation
3           12

到目前为止,还不足为奇。
现在,这里变得有些棘手:SQL Server广泛使用implicit conversion.

基本上,每次将两种不同的数据类型进行比较,组合或分配时,SQL Server都会尝试将一种数据类型隐式转换为另一种数据类型。
这不是任意完成的-SQL Server有一个记录良好的data type precedence表。 SQL Server将尝试从较低数据类型到较高数据类型的隐式转换,并且由于int在该表中的位置比char高-它会尝试将char转换为{{1 }},否则将失败。

在脚本之前使用相同的变量:

int

将产生以下结果:

SELECT  @A + @B As Addition,
        @X + @B As ImplicitConversionAndAdition;

将无法转换为int的char值设置为Addition ImplicitConversionAndAdition 3 3

@x

将获得以下结果:

SET @X = 'a';

-- Remember: @Y is a char(1)
SELECT @X + @Y As Concatenation;

但是,尝试Concatenation a2 将导致转换错误:

@X + @B

将获得以下结果:

  

将varchar值'a'转换为数据类型int时转换失败。