日期:2014-05-17  浏览次数:20520 次

这是SQL Server 的 Bug 吗,求解释呀求解释~~
if isnull(space(100),space(0))=space(0)    select 1  -- 输出1

if isnull(space(100),space(0))=space(10)   select 1  -- 输出1

if isnull(space(100),space(1))=space(1)    select 1  -- 输出1

if isnull(NULL,space(0))=space(100)        select 1  -- 输出1

上述判断为什么都为  呢?
而下面这些却是 符合预期 的输出:
select len(isnull(space(4),space(100))+'X') - 1  -- 输出4

select len(isnull(space(0),space(100))+'X') - 1  -- 输出0

select len(isnull(NULL,space(100))+'X') - 1      -- 输出100

大家顺便也说说使用ISNULL函数应该注意的地方吧,太邪门了!
PS: space(n)表示由n个空格组成的字符串,space(0)就是''
    另外我使用的是2008R2

------解决方案--------------------
select len(space(4))
select len(space(100))
/*
0
*/

结果都是:0
从这里你可以找出答案了
------解决方案--------------------
你的疑问一句话就可以解答:

SQL SERVER在字符串比较时会忽略后面的空格

至于LEN,这个是函数内的处理机制,计算长度时忽略后面的空格
------解决方案--------------------
引用:
Quote: 引用:

我发现,这些个函数,比如:len都会把字符串转化为varchar或者nvarchar,然后再进行计算,这里的代码,:

select LEN(cast(SPACE(1)+'aaa' as char)),
       LEN(cast('aaa'+SPACE(1) as CHAR))
/*
4 3
*/  


而一旦转化为varchar或nvarchar,那么自动就会忽略尾部的空格了
char类型之间的比较和算len()也是会忽略尾随空格的,不懂为什么微软要这样处理


还真是,我试了一下,确实是像你说的,char也会忽略尾部的空格:

select case when CAST('aa' AS char) = CAST('aa ' AS CHAR)
                 then 1
            else 0
       end
/*
1
*/