Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Transact-SQL字符串自连接_Sql_Sql Server - Fatal编程技术网

Transact-SQL字符串自连接

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

我是SQL新手,希望为MS SQL Server(MS SQL Server 2012)创建一些UDF函数,但非常简单的表达式不起作用。我只想连接两个字符串并将结果保存到第一个:

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,因为它是一个可变长度的字符串。