在插入触发器上将查询作为字符串插入数据库

时间:2017-12-07 19:00:44

标签: sql-server database triggers

我正在尝试创建一个触发器,每次在表中创建一个新行时都会触发该触发器。发生这种情况时,将准备一个插入查询,以反映行的插入方式。此查询将存储到另一个数据库中的表中。

举例说明:

  • 数据库A具有表产品(id,name,duration,isavailable)。
  • 数据库B有一个表mysql_query(id,query)

当在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数据库。

1 个答案:

答案 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

忽略新字段,我做了一些修改,但与手头的问题无关。