我有以下SQL语句不工作和触发的部分不能找出原因:的SQL Server 2008 - CAST为nvarchar不工作
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')
我不知道为什么和希望得到一些帮助,因为我需要登录被删除记录的用户。
感谢
UPDATE
感谢社会各界反响热烈。我宣布employeename为VARCHAR(255)和编辑insert语句
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,为什么要投它?如果它是空的,你的整个concat将是NULL,你必须做一些检查,并添加空字符串,如果它是NULL - COALESCE(@EmployeeName,'')...也像上面提到的你应该设置一个长度每次,当你声明它没有长度,默认为1 –
您的触发器似乎被破坏 - “已删除”是一个表,可能包含0,1或*多*行。将它的值赋给一个标量变量,'SELECT @Orderid = DELETED.id'是有缺陷的(如果这样的话甚至可以工作 - 我还以为你还需要一个用于该查询的'FROM'子句)。 –
达米恩 - 我的理解是,当一条记录即一行被删除时,触发器会运行?如果我错了,请纠正我。是的SELECT @orderid确实返回一个值,语法看起来很奇怪,但在这里有其他触发器使用它,并工作fine.cheers – Nick