Transact-SQL字符串自连接

时间:2012-09-06 17:02:20

标签: sql sql-server

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

DECLARE @ret   CHAR (20)
SET @ret = '4'
SET @ret = @ret + '55'

执行后,@ret仍然在4!为什么?如果我为'4'引入另一个变量,它可以工作。我怎样才能克服这个问题?

5 个答案:

答案 0 :(得分:3)

那是因为您使用char数据类型。

将值'4'存储在char(20)中时,它变为'4___________________'(长度为20个字符,此处_表示空格)。

当您连接'4___________________''55'时,您会获得'4___________________55'(长度为22个字符)。

当您将其存储在char(20)变量中时,它将被截断为20个字符,然后您获得'4___________________'

答案 1 :(得分:2)

如果您有CHAR(20),则第一个SET会在结尾处实际存储'4' with 19 blank characters。这是因为CHAR数据类型是固定宽度的,并且将使用空白字符填充数据,直到达到此处的大小为20。

当您将'55'连接到结尾时,它将是字符串中的第21个和第22个字符,当您尝试将其存储在@ret中时会掉落,而@ret只能容纳前20个字符。

使用VARCHAR可以解决您的问题,让@ret成为您所需的确切尺寸。

DECLARE @ret VARCHAR(20);
SET @ret = '4';
SET @ret = @ret + '55';

答案 2 :(得分:1)

由于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'

请参阅 SQLFIDDLE

答案 3 :(得分:1)

更改变量的数据类型以匹配您连接的内容:而不是char使用varchar

答案 4 :(得分:0)

尝试在函数中使用'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'