2016-11-07 425 views
0

获取以下错误:第21行是declare语句。 我无法弄清楚这一点。 Done_ON显然是datetime类型,为什么编译器会抱怨? 谢谢。不允许从数据类型datetime到数字的隐式转换

消息257,级别16,状态3,过程insert_employee_details,第21行 不允许将数据类型datetime隐式转换为数字。使用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() 
) 
+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; 

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

+0

显然问题是我没有列出第五列。谢谢。答案接受 – user127815

0

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

相关问题