【发布时间】:2015-09-11 10:36:57
【问题描述】:
我有以下 SQL 语句作为触发器的一部分,它不工作并且无法弄清楚原因:
DECLARE @Orderid INT
DECLARE @CountOfOrderItems INT
DECLARE @EmployeeID INT
DECLARE @EmployeeName NVARCHAR
SELECT @Orderid = DELETED.id
SET @CountOfOrderItems = (select count(*) from OrderDetails where OrderID = @Orderid)
SET @EmployeeName = (SELECT Firstname + ' ' + Lastname from Employees where employees.id =
(SELECT employeeid from Orders where Orders.id = @Orderid))
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
VALUES ('Orders table',
'Order deleted',
'Order with ' + CAST(@CountOfOrderItems as varchar) + ' items deleted by '+ CAST(@EmployeeName as nvarchar))
applicationlog 表的列数据类型都是 nvarchar(255) 用于 sourceobject 和 logtype 和 nvarchar(max) 用于消息。
问题是,当我包含CAST(@EmployeeName as nvarchar) 位时,消息列中没有输入任何内容,并且显示为空。在其他两列中输入数据。将员工名称转换为 varchar 也不起作用。
当我删除上面以粗体显示的位并使用以下代码时,它可以工作,并且 countoforderitems 的转换工作。
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
VALUES ('Orders table',
'Order deleted',
'Order with ' + CAST(@CountOfOrderItems as varchar) + ' items deleted')
我不知道为什么,希望得到一些帮助,因为我需要记录正在删除记录的用户。
谢谢
更新
感谢所有回复的人。我将 employeename 声明为 VARCHAR(255) 并将插入语句编辑为
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
values ('Orders table','Order deleted','Order with ' + CAST(@CountOfOrderItems as varchar(255)) + ' items deleted by ' + coalesce(@EmployeeName,''))
现在所有信息都在那里,除了我认为返回空字符串的@Employeename,即使员工存在于表中。所以在最后一列中,我现在有 “3 个项目被“删除”强>
哪个比之前的null好,但是为什么@Employeename是空白的呢?
【问题讨论】:
-
@EmployeeName 在声明中已经是 NVARCHAR,你为什么要转换它?如果它是空的,你的整个连接将是空的,你必须做一些检查并添加空字符串,如果它是空的 - COALESCE(@EmployeeName,'')......同样就像提到你应该每次设置一个长度,当你声明它没有长度,默认为 1
-
您的触发器似乎已损坏 -
deleted是一个可能包含 0、1 或 多个 行的表。将值从它分配给一个标量变量,SELECT @Orderid = DELETED.id是有缺陷的(如果这甚至有效 - 我原以为您仍然需要该查询的FROM子句)。 -
Damien - 我的理解是触发器在一条记录(即一行被删除)时运行?如果我错了,请纠正我。是的,SELECT @orderid 确实返回了一个值,并且语法看起来确实很奇怪,但是这里还有其他触发器可以使用它并且工作正常。干杯
标签: sql sql-server triggers