【发布时间】:2012-09-27 18:27:36
【问题描述】:
下面是在我们的一个 SQL 表上用于任何插入/更新操作的触发器。 99/100 次这个触发器工作得很好,但是我们时不时地收到这个错误消息:
无法将值 NULL 插入到表的“TransactionDate”列中 'AgentResourcesU01.dbo.TransactionLog';列不允许空值。
插入失败。声明已终止。
从插入语句中可以看出,我们的事务日志表中的列是TransactionDate, Operator, TableName, Action, TableString 和UserId。我在开始的 SELECT 语句中设置了变量@transDate,所以在我看来,除非是坏数据进入,否则 NULL 应该不会进入那里。
有什么想法吗?
BEGIN
SELECT @symetraNumber = SymetraNumber, @lastChangeOperator = LastChangeOperator, @transDate = LastChangeDate, @entityType = EntityType,
@firstName = FirstName, @lastName = LastName, @suffix = NameSuffix, @corpName = CorporateName, @controlId = ControlId
FROM inserted
IF @firstName IS NULL SET @firstName = 'NULL'
IF @lastName IS NULL SET @lastName = 'NULL'
IF @suffix IS NULL SET @suffix = 'NULL'
IF @corpName IS NULL SET @corpName = 'NULL'
IF @controlId IS NULL SET @controlId = 'NULL'
SET @tableString = 'SymNum:' + @symetraNumber + ' EntType:' + @entityType + ' Fname:' + @firstName + ' Lname:' + @lastname + ' Suff:' + @suffix +
' CorpName:' + @corpName + ' ctrlId:' + @controlId
INSERT INTO TransactionLog (TransactionDate, Operator, TableName, Action, TableString, UserId)
VALUES (@transDate, 'Op', @tableName, @action, @tableString, @lastChangeOperator)
END
【问题讨论】:
-
您确认
LastChangeDate不为空吗? -
结果如何?
-
抱歉,LastChangeDate 不为空。
-
您的主要问题是:您似乎认为
Inserted表只包含一行。这个假设是错误的。触发器每批次触发一次 - 例如如果您一次插入 50 行,您的触发器将触发 一次 并且Inserted表将包含 50 行 - 所以您的语句如SELECT @symetraNumber = SymetraNumber .. FROM inserted将惨遭失败...... . -
不要使用 VALUES 插入,而是使用插入的 SELECT 语句。
标签: sql-server tsql triggers