我试图连接字符串但它似乎不起作用。有人可以告诉我下面的代码有什么问题吗?
declare @x varchar = 'a';
SET @x += 's'
SET @x = @x + 'z'
SET @x = concat('x','y')
SELECT @x;
上述方法均无效。我输出为'x'。
根据Aaron Bertrand的文章:
https://sqlblog.org/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length
...你不应该在没有长度的情况下宣布VARCHAR
。
问题是,如果您没有定义长度,SQL Server将为您分配一个长度,它可能没有您期望的那么宽。在某些情况下,它将是1(是的,这是第一,而不是拼写错误),在其他情况下,它将是30。
docs在这方面也很清楚:
varchar [(n | max)] 如果未在数据定义或变量声明语句中指定n,则默认长度为1.如果在使用CAST和CONVERT函数时未指定n,则默认长度为30。
这样可以正常工作:
declare @x varchar(10) = 'a';
SET @x += 's'
SET @x = @x + 'z'
SET @x = concat('x','y')
SELECT @x;
当你宣布varchar()
时,你需要一个长度。否则,它只有一个字符长:
declare @x varchar(255) = 'a';
一旦变量足够大以存储值,其余代码就可以工作。
你需要告诉sql你的varchar的长度。在大多数情况下,sql将varchar视为varchar(1)
declare @x varchar(10) = 'a';
SET @x += 's'
SET @x = @x + 'z'
SET @x = concat('x','y')
SELECT @x;
您需要使用长度声明VARCHAR,尝试将其更改为VARCHAR(20)并查看会发生什么。
声明VARCHAR没有长度会导致Length为1。
下面的代码可以工作,记住你需要声明字符串足够长的时间来包含结果。
declare @a varchar(100)
declare @b varchar(100)
set @a = 'This should ';
set @b = 'work';
select @a + @b
如果你有这样的短字符串:
declare @a varchar(4)
declare @b varchar(4)
set @a = 'This should ';
set @b = 'work';
select @a + @b
你最终会得到结果:
'Thiswork'