我正在尝试连接字符串但它似乎不起作用。有人能告诉我下面的代码有什么问题吗?
declare @x varchar = 'a';
SET @x += 's'
SET @x = @x + 'z'
SET @x = concat('x','y')
SELECT @x;
以上方法均无效。我输出为'x'。
答案 0 :(得分:7)
根据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.使用时未指定n CAST和CONVERT函数,默认长度为30。
这样可以正常工作:
declare @x varchar(10) = 'a';
SET @x += 's'
SET @x = @x + 'z'
SET @x = concat('x','y')
SELECT @x;
答案 1 :(得分:3)
宣布varchar()
时需要一个长度。否则,它只有一个字符长:
declare @x varchar(255) = 'a';
一旦变量足够大以存储值,其余代码就可以工作。
答案 2 :(得分:3)
你需要告诉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;
答案 3 :(得分:2)
下面的代码可以使用,记住你需要声明字符串足够长以包含结果。
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'
答案 4 :(得分:2)
您需要使用长度声明VARCHAR,尝试将其更改为VARCHAR(20)并查看会发生什么。
声明不带长度的VARCHAR会导致长度为1。