运行此查询:
SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.'+BE_Numero_carnet) AS varchar(1000)) AS chemin
FROM ...
导致错误:
第1级状态16消息245
转换varchar值'\ BE'时转换失败。数据类型为int。
答案 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时转换失败。