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对象定义以及执行代码时提供的模式。我讨厌做出错误的人,但希望其他人能从我的错误中吸取教训。
答案 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