2012-09-06 19 views
3

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

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

执行后,@ret保持在4!为什么?如果我为“4”引入另一个变量,它会起作用。我怎样才能克服这个问题?

+0

更改字符为VARCHAR。 Char(20)总是20个长,所以它会在'4后面加'55'' (ISH)。为什么它在第二种情况下工作我不得不猜测它的转换为varchar以产生结果然后覆盖。我不会依赖那个,并且会使用Varchar,因为它是一个可变长度的字符串。 –

回答

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

2

当你有一个CHAR(20)第一SET WIL我实际上在'4' with 19 blank characters最后存储。这是因为CHAR数据类型是固定宽度的,并且会用空白字符填充数据,直到达到20的大小。

当您连接'55'到最后时,它将是字符串中的第21和第22个字符,并且当您尝试将其存储在@ret(它只能保存前20个字符)时会脱落。

使用VARCHAR将解决您的问题,使@ret成为您需要的确切大小。

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

尝试在函数中使用“投”,以确保@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' 
3

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

当存储在char(20)价值'4',它成为'4___________________'(20个字符长,_这里代表空格)。

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

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

1

更改数据类型以符合您所串联什么:不是字符使用VARCHAR