我正在尝试创建一个触发器,每次在表中创建一个新行时都会触发该触发器。发生这种情况时,将准备一个插入查询,以反映行的插入方式。此查询将存储到另一个数据库中的表中。
举例说明:
当在A.products中插入新行(1001,'测试产品',365,1)时,触发器应将以下内容插入到B.mysql_query中:
INSERT INTO products (id, name, duration, value, isavailable)
VALUES (1001, test product, 365, 1, 1)
默认情况下,值目前始终为1。
到目前为止,触发器的代码是:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER c_products
ON migrimi_test.dbo.products
AFTER INSERT
AS
DECLARE @c_id INT;
SET @c_id = (SELECT id from inserted);
DECLARE @c_name INT;
SET @c_name = (SELECT name from inserted);
DECLARE @c_duration INT;
SET @c_duration = (SELECT duration from inserted);
DECLARE @c_isavailable INT;
SET @c_isavailable = (SELECT isvisible from inserted);
BEGIN
SET NOCOUNT ON
INSERT INTO migrimi_temp.dbo.mysql_query (id, mysql_query)
VALUES (DEFAULT, 'INSERT INTO products (id, name, duration, value, isavailable) values ('+CAST(@c_id as nvarchar(50))+', '+'"'+@c_name'+'"'+, '+@c_duration+', 1, '+@c_isavailable+')' )
END
GO
我运行触发器,后者执行插入。有一个错误说:
转换nvarchar值'测试产品&#39>时转换失败到数据类型int。
我理解它指的是变量@c_name
的替换,但这是我写过的第一个触发器,我无法分辨出究竟是什么错误。
A和B是SQL数据库。
答案 0 :(得分:0)
好的,触发器有3个问题:
1-正如WEI_DBA指出的那样,@ c_name被声明为int,即使它实际上是一个varchar。
2-显然每个int变量都应该被转换为varchar,否则会抛出以下错误:
sql trigger将varchar值转换为时转换失败 datatype int
我仍然没有把这个弄清楚100% - 这是解决方案,但我在Google上搜索原因。因此,不要把我的话视为理所当然,并随时提供更可靠的消息来源或替代解释/解决方案。毕竟我是一个触发新手。
3-虽然触发器本身可以工作,但是除非值@c_name(或任何varchar值)被双引号括起,否则插入表mysql_query中的查询将无效。
工作触发器的最终结果如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER c_products
ON migrimi_test.dbo.products
AFTER INSERT
AS
DECLARE @c_id INT;
DECLARE @c_name nvarchar(100);
DECLARE @c_duration int;
DECLARE @c_isavailable INT;
Select @c_id = id, @c_name = name, @c_duration = duration, @c_isavailable = isvisible from inserted
BEGIN
SET NOCOUNT ON
INSERT INTO migrimi_temp.dbo.sql_query (query)
VALUES ('INSERT INTO products (id, name, duration, value, isavailable, createdAt, updatedAt) values ('+CAST(@c_id as nvarchar(50))+', '+'"'+@c_name+'"'+',
'+CAST(@c_duration as nvarchar(50))+', 1, '+CAST(@c_isavailable as nvarchar(50))+', Now(), Now());' )
END
GO
忽略新字段,我做了一些修改,但与手头的问题无关。