我是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'引入另一个变量,它可以工作。我怎样才能克服这个问题?
答案 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'