在使用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.
答案 0 :(得分:3)
由于在包含NOT NULL列定义的表中存在完全NULL行,因此显示错误消息。
在这种情况下,损坏的原因是未知的,但是可以解释错误,SELECT
查询正在创建哈希表以便于连接,它试图将NULL插入主键列。
这可以通过创建一个具有相同定义但所有列NULL
能够的表来测试,从损坏的表中插入,然后在假定的{{1}中查询NULL
s列。
答案 1 :(得分:0)
有时当我打电话时
select * from sys.dm_exec_query_stats
我收到此错误,但不知道如何捕获它。 TRY
CATCH
没有捕捉到这个错误。