Transact-SQL字符串自连接
我是SQL新手,希望为MS SQL Server(MS SQL Server 2012)创建一些UDF函数,但非常简单的表达式不起作用。我只想连接两个字符串并将结果保存到第一个:Transact-SQL字符串自连接,sql,sql-server,Sql,Sql Server,我是SQL新手,希望为MS SQL Server(MS SQL Server 2012)创建一些UDF函数,但非常简单的表达式不起作用。我只想连接两个字符串并将结果保存到第一个: DECLARE @ret CHAR (20) SET @ret = '4' SET @ret = @ret + '55' 执行后,@ret保持在4!为什么?如果我为'4'引入另一个变量,它会起作用。如何克服这个问题?因为CHAR是一种固定长度的字符串数据类型,所以字段中的任何剩余空间都用空格填充 在您的场景中,S
DECLARE @ret CHAR (20)
SET @ret = '4'
SET @ret = @ret + '55'
执行后,
@ret
保持在4
!为什么?如果我为'4'引入另一个变量,它会起作用。如何克服这个问题?因为CHAR
是一种固定长度的字符串数据类型,所以字段中的任何剩余空间都用空格填充
在您的场景中,SET@ret=@ret+'55'
将尝试存储22个字符,但不幸的是,该变量已声明为20个字符长,因此它将结果截断回20个字符。因此,您将有20个字符,截断最后2个字符,即'55'
只有在确定特定的char
数据类型列必须容纳的数据长度时,才使用char
数据类型
如果您使用nvarchar(20)而不是char(20),它将很好地工作
DECLARE @ret nvarchar (20)
SET @ret = '4'
SET @ret = @ret + '55'
当您有一个字符(20)
时,请参见,第一个集将实际存储'4',末尾有19个空白字符。这是因为CHAR
数据类型的宽度是固定的,并且将使用空白字符填充数据,直到达到此处的大小20为止
当您将'55'
连接到末尾时,它将是字符串中的第21个和第22个字符,当您尝试将其存储在@ret中时,它将消失,而@ret只能容纳前20个字符
使用VARCHAR
将解决您的问题,允许@ret为您所需的确切大小
DECLARE @ret VARCHAR(20);
SET @ret = '4';
SET @ret = @ret + '55';
尝试在函数中使用“cast”来确保@ret是一个字符串,将代码更改为该字符串即可;希望这有帮助
DECLARE @ret CHAR (20)
SET @ret = '4'
SET @ret = cast(@ret as varchar(1)) + '55'
或者将CHAR(20)更改为NVARCHAR(20),如下所示:
DECLARE @ret NVARCHAR (20)
SET @ret = '4'
SET @ret = @ret + '55'
这是因为您使用了char
数据类型
当您将值'4'
存储在字符(20)
中时,它将变成'4\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
当您将'4.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu55'
与连接在一起时,您会得到'4.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
当您将其存储回char(20)
变量中时,它将被截断为20个字符,并且您将得到'4\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu'
更改变量的数据类型以匹配您正在连接的内容:而不是使用varchar。字符(20)总是20长,所以它在'4'(ish)后面加55。为什么它在第二种情况下工作,我不得不猜测它转换为varchar以产生结果,然后覆盖。不过,我不会依赖它,而是使用Varchar,因为它是一个可变长度的字符串。