这导致'B':
DECLARE @NAME VARCHAR(20)=' s'
IF (@NAME IS NULL OR @NAME='')
SELECT 'A'
ELSE
SELECT 'B'
然而,这导致'A'。
DECLARE @NAME VARCHAR=' s'
IF (@NAME IS NULL OR @NAME='')
SELECT 'A'
ELSE
SELECT 'B'
唯一的区别是VARCHAR(20)
vs VARCHAR
。
这种奇怪行为的原因是什么?
答案 0 :(得分:4)
Sql Server将未指定长度的VARCHAR
默认为length of 1。如果在conjunction with Microsoft's interpretation of ANSI/ISO SQL-92 (ref here)中使用,则会导致填充在相等比较期间将字符串比较为相等的长度,从而导致' '
为=
到''
,因此非 - 第二次测试中的直觉'A'
。
答案 1 :(得分:0)
当没有指定大小时,VARCHAR需要指定一个大小,它假定声明的长度为一个字符。
要确认这一点,您可以检查变量的长度。
因为,您的if条件是检查'''它满足了条件。
DECLARE @NAME VARCHAR=' s'
select datalength(@name)
returns 1
DECLARE @NAME VARCHAR(20)=' s'
select datalength(@name)
returns 2