我有一个查询,在原来的SQL2000中执行没有问题,但换到SQL2008就提示:
尝试将不可为NULL的列的值设置为NULL。请大家帮我看一下:SELECT A.001,A.002,A.003,B.007,B.008,C.002
FROM 表A as A
LEFT JOIN 表2 as B on A.013=B.001 AND A.014=B.002
LEFT JOIN 表3 as C on A.010=C.001在网上找了一大圈,可能是因为A.013与A.014有null值的原因,我换成下面的也不行:SELECT A.001,A.002,A.003,B.007,B.008,C.002
FROM 表A as A
LEFT JOIN 表2 as B on ISNULL(A.013,'')=B.001 AND ISNULL(A.014,'')=B.002
LEFT JOIN 表3 as C on A.010=C.001但实际确实要取表A的全部内容,也就是说要用到LEFT JOIN的方式,执行时总会提示:尝试将不可为NULL的列的值设置为NULL

解决方案 »

  1.   

    ISNULL(A.013,'')=B.001 AND ISNULL(A.014,'')=B.002条件语句里面,没见过这样写的..
      

  2.   

    这样写是没有问题的,您可以试一下。我觉得LZ的问题,应该是表中设定的时候,该栏位为not null的,但是在做连接的时候为null值,才导致这样的错误。
      

  3.   

    在实际情况中,A.013与A.014是可能为空的,所以采用的是LEFT JOIN ,需要提取表A的全部信息,以及对应的表B的符合信息
      

  4.   

    很奇怪,我将=改成like,就可以执行通过,但又无法确定这样的结果是否正常;
    LEFT JOIN 表2 as B on A.013 like B.001 AND A.014 like B.002
      

  5.   

    left join 是容易产生null
    但是 查询结果不应该用表的约束约束
      

  6.   

    通过测试,在查询结果集上,可以为null,没有约束。
    http://topic.csdn.net/u/20091207/11/ee1a5b2e-8776-4616-ae6b-d775e41c1449.htmlCREATE TABLE TestNull
    (
    id INT NOT NULL,
    NAME NVARCHAR(20) NOT null
    )INSERT INTO TestNull
    SELECT '1','evan'
    UNION ALL
    SELECT '2','sam'CREATE TABLE A
    (
    id INT ,
    NAME NVARCHAR(20) 
    )INSERT INTO A
    SELECT '1',N'张三,李四'
    UNION ALL
    SELECT '2',N'王五'
    UNION ALL
    SELECT '2',N'马六,朱七'SELECT * FROM A a
    left JOIN TestNull t
    ON a.ID=t.idID          NAME           id          NAME
    ----------- ------------------------------------
    1           张三,李四     1           evan
    2           王五           2           sam
    3           马六,朱七     NULL        NULL(3 row(s) affected)
      

  7.   

    看来问题还是出在这儿了:
    ISNULL(A.013,'')=B.001 AND ISNULL(A.014,'')=B.002
      

  8.   

    但我查数据库中,A.013与A.014没有为NULL的记录,但有为''的记录。
      

  9.   

    我试过去掉ISNULL函数的,效果一样。
      

  10.   

    SQL2008 对NULL的处理与SQL2000的处理有点不同,有时NULL对''或0的比较有点含糊,故您的条件可改为:
    on ISNULL(A.013,'<B.001不会出现的值>')=B.001