Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在CONCAT中将varchar值转换为int时,转换失败_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

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时,转换失败