试图将非NULL-able列的值设置为NULL

时间:2015-10-28 13:28:49

标签: sql-server tsql sql-server-2014

在使用SQL Server 2014的ISNULL()功能时,我在客户端数据库上遇到了一个奇怪的问题。在线搜索引导我遇到同样的错误,但在INSERT时。运行简单的SELECT

时出现以下错误
Msg 681, Level 16, State 3, Line 1
Attempting to set a non-NULL-able column's value to NULL.

以下查询产生该错误:

SELECT
    ISNULL( [t2].[date_update], GETDATE() )
FROM
    [dbo].[t1]
INNER JOIN
    [dbo].[t2] ON [t1].[a] = [t2].[id];

我已经删除了表格以简化我的解释,但受影响的列定义如下:

CREATE TABLE [dbo].[t1] (
    [id]          INT           NOT NULL PRIMARY KEY,
    [a]           NVARCHAR(100) NOT NULL
);

CREATE TABLE [dbo].[t2] (
    [id]          BIGINT        NOT NULL PRIMARY KEY,
    [date_update] DATETIME      NULL
);

非常感谢任何帮助或见解!

编辑:

在疑难解答中,我能够使用以下INSERT在客户端系统上重现相同的错误消息:

CREATE TABLE #t2 ([id] BIGINT NOT NULL PRIMARY KEY NONCLUSTERED, [date_update] DATETIME NULL);

INSERT INTO #t2 ([id], [date_update)
SELECT [id], [date_update]
FROM [dbo].[t2];

EDIT2:

更多故障排除表明SELECT正在使用的索引有问题。在尝试重建索引时,我得到了相同的错误!

Rebuild failed for Index xxx
Attempting to set a non-NULL-able column's value to NULL.

2 个答案:

答案 0 :(得分:3)

由于在包含NOT NULL列定义的表中存在完全NULL行,因此显示错误消息。

在这种情况下,损坏的原因是未知的,但是可以解释错误,SELECT查询正在创建哈希表以便于连接,它试图将NULL插入主键列。

这可以通过创建一个具有相同定义但所有列NULL能够的表来测试,从损坏的表中插入,然后在假定的{{1}中查询NULL s列。

答案 1 :(得分:0)

有时当我打电话时 select * from sys.dm_exec_query_stats 我收到此错误,但不知道如何捕获它。 TRY CATCH 没有捕捉到这个错误。