为什么我得到"不能将值NULL插入列' X'"错误,在硬编码值上?

时间:2015-10-07 13:56:48

标签: sql sql-server tsql

INSERT INTO DDA_MatchStrings 
(Unit, FamilyID, AccountNumber, MatchType,  MatchString, SnapshotDate,  IgnoreRecord,   Merged)
SELECT 
 Unit, FamilyID, AccountNumber, 'EMAIL',    MatchString, @SnapshotDate, 0,              0
FROM DDA_MatchStrings_temp AS tms 
WHERE tms.MatchString IN 
    (SELECT tms.MatchString FROM DDA_MatchStrings_temp AS tms
    GROUP BY tms.MatchString
    HAVING COUNT(DISTINCT unit) > 1)
ORDER BY tms.MatchString

我在字段参考中添加了缩进以进行目视观察。

此语句位于存储过程中,但是当SP到达此时,它会出现以下错误:

  

无法将值NULL插入列' IgnoreRecord',表中   ' Db.dbo.TableX&#39 ;;列不允许空值。插入   失败。

我知道这个错误意味着什么。我对T-SQL并不陌生。但是,我完全不知道为什么它会给我这个错误?该值不为空。它是一个硬编码0。仅供参考,相关字段为tinyint。它应该接受这个值。此外,此语句也在其他存储过程中(MatchType字段中只有不同的值。

可能导致此错误的原因是什么?

更新

我选择回答我自己的问题,而不是删除它。这是一个很好的案例,没有注意数据库模式已经导致问题。值得更新作为参考,您应该始终关注SQL对象定义以及执行代码时提供的模式。我讨厌做出错误的人,但希望其他人能从我的错误中吸取教训。

1 个答案:

答案 0 :(得分:5)

好的......我觉得有点愚蠢,但我不妨回答这个后人的问题。

问题不在于insert语句或我的脚本......它与模式有关。 SP的定义是:

CREATE PROCEDURE dbo.DDA_Generate_PotentialDuplicate_Emails

显然,在某些时候我将其定义为:

CREATE PROCEDURE DDA_Generate_PotentialDuplicate_Emails

这是我第一次使用公司数据库,默认情况下,关联架构是用户的登录而不是dbo。

所以...当我改变执行代码时:

EXEC DDA_Generate_PotentialDuplicate_Emails

EXEC dbo.DDA_Generate_PotentialDuplicate_Emails

所有内容都开始正常运行,因为我正在运行正确版本的存储过程。 :P