不允许从数据类型datetime到数字的隐式转换
问题描述:
获取以下错误:第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()
)
答
你应该总是名单为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
答
DB_Actions表中的Id列是标识列,不允许在触发器中使用INSERT语句,因此您错过了第五列,因此SQL Server试图将GetDate()转换为Record_Id,从而导致错误。
用您正在使用的数据库标记您的问题。 –