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

sql 2008 尝试将不可为NULL的列的值设置为NULL
我有一个查询,在原来的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

------解决方案--------------------
ISNULL(A.013,'')=B.001 AND ISNULL(A.014,'')=B.002

条件语句里面,没见过这样写的..

------解决方案--------------------
引用:
ISNULL(A.013,'')=B.001 AND ISNULL(A.014,'')=B.002

条件语句里面,没见过这样写的..

这样写是没有问题的,您可以试一下。

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

------解决方案--------------------
如果只是警告信息可不管它。
------解决方案--------------------
left join 是容易产生null
但是 查询结果不应该用表的约束约束

------解决方案--------------------
通过测试,在查询结果集上,可以为null,没有约束。
http://topic.csdn.net/u/20091207/11/ee1a5b2e-8776-4616-ae6b-d775e41c1449.html

CREATE 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.id

ID          NAME           id          NAME
----------- ------------------------------------
1           张三,李四     1           evan
2           王五           2           sam
3           马六,朱七     NULL        NULL

(3 row(s) affected)

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