尝试将不可为 NULL 的列的值设置为 NULL

Chr*_*ord 5 t-sql sql-server 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.
Run Code Online (Sandbox Code Playgroud)

以下查询会产生该错误:

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

我已经精简了表格以简化说明,但受影响的列定义如下:

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
);
Run Code Online (Sandbox Code Playgroud)

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

编辑:

在故障排除中,我能够使用以下内容在客户端系统上重现相同的错误消息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];
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

Rebuild failed for Index xxx
Attempting to set a non-NULL-able column's value to NULL.
Run Code Online (Sandbox Code Playgroud)

Chr*_*ord 5

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

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

可以通过创建一个具有相同定义但所有列都NULL可用的表来测试这一点,从损坏的表中插入该表,然后NULL在假定的NOT NULL列中查询 s。