我是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”引入另一个变量,它会起作用。我怎样才能克服这个问题?
我是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”引入另一个变量,它会起作用。我怎样才能克服这个问题?
由于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'
当你有一个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';
尝试在函数中使用“投”,以确保@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
数据类型。
当存储在char(20)
价值'4'
,它成为'4___________________'
(20个字符长,_
这里代表空格)。
当您连接'4___________________'
和'55'
时,您将获得'4___________________55'
(22个字符长)。
当您将其存储在char(20)
变量中时,它将被截断为20个字符,并且您获得'4___________________'
。变量的
更改数据类型以符合您所串联什么:不是字符使用VARCHAR
更改字符为VARCHAR。 Char(20)总是20个长,所以它会在'4后面加'55'' (ISH)。为什么它在第二种情况下工作我不得不猜测它的转换为varchar以产生结果然后覆盖。我不会依赖那个,并且会使用Varchar,因为它是一个可变长度的字符串。 –