Sql 尝试连接2个字符串,结果以大量空格结尾

Sql 尝试连接2个字符串,结果以大量空格结尾,sql,sql-server,string,tsql,Sql,Sql Server,String,Tsql,或 或 输出为: 如果没有这些空格,如何获得输出?您使用的是char,而您可能需要[n]varchar(…):前者用空格填充字符串,而后者不: select ltrim(convert(char, 123) + 'sda') 但更简单的是:concat()默认情况下强制将其参数转换为正确的数据类型,因此应该这样做: concat(convert(varchar(10), 123), 'sda'); 您使用的是char,而您可能需要[n]varchar(…):前者在字符串中填充空格,而后者不

输出为:


如果没有这些空格,如何获得输出?

您使用的是
char
,而您可能需要
[n]varchar(…)
:前者用空格填充字符串,而后者不:

select ltrim(convert(char, 123) + 'sda')
但更简单的是:
concat()
默认情况下强制将其参数转换为正确的数据类型,因此应该这样做:

concat(convert(varchar(10), 123), 'sda');

您使用的是
char
,而您可能需要
[n]varchar(…)
:前者在字符串中填充空格,而后者不:

select ltrim(convert(char, 123) + 'sda')
但更简单的是:
concat()
默认情况下强制将其参数转换为正确的数据类型,因此应该这样做:

concat(convert(varchar(10), 123), 'sda');

首先,在SQL Server中,永远不要使用没有长度的
char
或相关字符串定义。SQL Server需要一个长度,默认值取决于上下文。如果您依赖于默认长度,那么您的代码就有一个bug正在等待发生

其次,
char
几乎从来都不是你想要的。它是一个固定长度的字符串,较短的字符串用空格填充

如果需要显式转换,请使用
varchar
,可变长度字符串:

concat(123, 'sda')
或者省去显式转换,使用
concat()


首先,在SQL Server中,永远不要使用没有长度的
char
或相关字符串定义。SQL Server需要一个长度,默认值取决于上下文。如果您依赖于默认长度,那么您的代码就有一个bug正在等待发生

其次,
char
几乎从来都不是你想要的。它是一个固定长度的字符串,较短的字符串用空格填充

如果需要显式转换,请使用
varchar
,可变长度字符串:

concat(123, 'sda')
或者省去显式转换,使用
concat()


这里的问题有两个方面。首先,您正在转换为
字符
,这是一种固定宽度数据类型,其次,您没有定义
字符
的长度,因此使用默认长度。对于
CAST
CONVERT
这是
char(30)

因此,您需要开始的是
convert(char,123)
。这将int
123
转换为固定宽度字符串
'123'
。然后将
varchar(3)
'sda'
连接到该值,从而得到
'123 sda'
。这是工作完全按照书面,但显然不是你想要的

显而易见的解决方法是使用
varchar
并定义长度,例如
CONCAT(CONVERT(varchar(5),123),'sda')
,它将返回
'123sda'
,但是,函数的所有参数都是字符串类型:

字符串值

要连接到其他值的字符串值。
CONCAT
函数需要至少两个字符串值参数,且不超过254个字符串值参数

这意味着您只需传递值
123
,它将被隐式转换为字符串类型:
CONCAT(123,'sda')



重申我的评论链接:

这里的问题有两个方面。首先,您正在转换为
字符
,这是一种固定宽度数据类型,其次,您没有定义
字符
的长度,因此使用默认长度。对于
CAST
CONVERT
这是
char(30)

因此,您需要开始的是
convert(char,123)
。这将int
123
转换为固定宽度字符串
'123'
。然后将
varchar(3)
'sda'
连接到该值,从而得到
'123 sda'
。这是工作完全按照书面,但显然不是你想要的

显而易见的解决方法是使用
varchar
并定义长度,例如
CONCAT(CONVERT(varchar(5),123),'sda')
,它将返回
'123sda'
,但是,函数的所有参数都是字符串类型:

字符串值

要连接到其他值的字符串值。
CONCAT
函数需要至少两个字符串值参数,且不超过254个字符串值参数

这意味着您只需传递值
123
,它将被隐式转换为字符串类型:
CONCAT(123,'sda')



重申我的评论链接:

其他人已经指出了问题的根本原因,如果您无法编辑数据类型,您可以始终使用
选择CONCAT(TRIM(CONVERT(char,123)),'sda')
。尽管强烈建议使用
varchar(n)
或指定
char
的独占长度,因为创建固定长度字符串然后使用
TRIM
减少长度是毫无意义的
varchar(30)
非常适合这里,因为长度仍然不能超过30个符号,但如果字符串较短,则不会使用所有长度。

其他人已经指出了问题的根本原因,如果无法编辑数据类型,则始终可以使用
选择CONCAT(TRIM(CONVERT(char,123)),'sda')
。尽管强烈建议使用
varchar(n)
或指定
char
的独占长度,因为创建固定长度字符串然后使用
TRIM
减少长度是毫无意义的
varchar(30)
非常适合这里,因为长度仍然不能超过30个符号,但如果字符串较短,则不会使用所有长度。

让我们参考Microsoft文档:

如果在数据定义或变量声明语句中未指定n,则默认长度为1。如果n不是sp
select concat(123, 'sda')
select convert(varchar, 123) + 'sda'