不允许从数据类型datetime到numeric的隐式转换

时间:2016-11-07 00:13:24

标签: sql-server datetime triggers insert

获得以下错误:第21行是声明语句。 我无法弄清楚这一点。 Done_ON显然属于datetime类型,为什么编译器会抱怨? 谢谢。

消息257,级别16,状态3,过程insert_employee_details,第21行 不允许从数据类型datetime到numeric的隐式转换。使用CONVERT函数运行此查询。

Use [StacysDB];
Go


--CREATE TABLE DB_Actions
--(
--Id numeric(5,0) IDENTITY(1,1) PRIMARY KEY,
--Table_Name varchar(20),
--Action_Name varchar(10),
--User_Name varchar(50),
--Done_ON datetime,
--Record_Id numeric(5,0)
--);


--INSERT TRIGGER
CREATE TRIGGER insert_employee_details
ON Employee_Details
FOR INSERT
AS
DECLARE @id int, @name varchar(20)
SELECT @id = Emp_Id, @name = Emp_First_Name FROM inserted
INSERT INTO DB_Actions
VALUES(@id,
        'Employee_Details',
        'INSERT',
        @name,
        getdate()
)

2 个答案:

答案 0 :(得分:2)

您应该始终列出insert的列:

INSERT INTO DB_Actions(id, table_name, action_name, user_name, done_on)
    VALUES(@id,
            'Employee_Details',
            'INSERT',
            @name,
            getdate()
    );

您错过了Record_Id。不过,我不确定为什么它会产生这个错误。如果Record_Id确实是表格中的第5列,您会收到此错误。

编写触发器的更合适的方法是假设inserted可能有多行:

INSERT INTO DB_Actions(id, table_name, action_name, user_name, done_on)
    SELECT Emp_Id, 'Employee_Details', 'INSERT', Emp_First_Name, getdate()
    FROM inserted;

至少,当你同时插入多行时,这不会产生错误。

答案 1 :(得分:0)

表DB_Actions中的Id列是标识列,不允许触发器中的INSERT语句,因此您错过了第五列,因此SQL Server尝试将GetDate()转换为Record_Id,从而导致错误。