Sql 在CONCAT中将varchar值转换为int时,转换失败
运行此查询:Sql 在CONCAT中将varchar值转换为int时,转换失败,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,运行此查询: SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.'+BE_Numero_carnet) AS varchar(1000)) AS chemin FROM ... 导致错误: Msg 245,第16级,状态1 将varchar值“\BE.”转换为数据类型int时,转换失败 不要使用+ SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.', BE_Numer
SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.'+BE_Numero_carnet) AS varchar(1000)) AS chemin
FROM ...
导致错误:
Msg 245,第16级,状态1将varchar值“\BE.”转换为数据类型int时,转换失败 不要使用+
SELECT CAST(CONCAT('BL.', IdBL,' - lgn.', LgnBL, ' \ BE.', BE_Numero_carnet) AS varchar(1000)) AS chemin
FROM ...
是正确的。这个答案是为了解释为什么它是正确的
+
运算符在SQL Server中具有双重含义。从某种意义上说,它是一个运算符。
换句话说,它是一个操作符 考虑以下代码:
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
到目前为止,没有任何意外。现在有点棘手了:SQLServer大量使用 基本上,每次比较、组合或分配两种不同的数据类型时,SQL Server都会尝试将一种数据类型隐式转换为另一种数据类型。
这不是任意完成的-SQL Server有一个记录良好的表。SQL Server将尝试从较低的数据类型隐式转换为较高的数据类型,并且由于
int
在该表中的位置高于char
,因此它将尝试将char
转换为int
,如果不可能,则将失败
使用之前脚本中的相同变量:
SELECT @A + @B As Addition,
@X + @B As ImplicitConversionAndAdition;
结果将是:
Addition ImplicitConversionAndAdition
3 3
Concatenation
a2
将无法转换为int的char值设置为@x
:
SET @X = 'a';
-- Remember: @Y is a char(1)
SELECT @X + @Y As Concatenation;
结果将是:
Addition ImplicitConversionAndAdition
3 3
Concatenation
a2
但是,尝试@X+@B
将导致转换错误:
SELECT @X + @B As ImplicitConversionFailure
结果将是:
Addition ImplicitConversionAndAdition
3 3
Concatenation
a2
将varchar值“a”转换为数据类型int时,转换失败