【发布时间】:2017-12-07 19:00:44
【问题描述】:
我正在尝试创建一个触发器,该触发器将在每次在表中创建新行时触发。发生这种情况时,将准备一个插入查询,以反映该行的插入方式。此查询将存储到另一个数据库的表中。
举例说明:
- 数据库 A 有表产品(id、name、duration、isavailable)。
- 数据库B有一个表mysql_query(id,query)
当新行 (1001, 'test product', 365, 1) 插入 A.products 时,触发器应将以下内容插入 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 值“测试产品”转换为数据类型 int 时转换失败。
我知道它指的是变量@c_name的替换,但这是我写的第一个触发器,我不知道到底是什么问题。
A 和 B 是 SQL 数据库。
【问题讨论】:
-
DECLARE @c_name INT; SET @c_name = (SELECT name from inserted);name is nvarchar... 将@c_name更改为 nvarchar 数据类型。 -
另外,您可以使用一个
Select语句。Select @c_id = id, @c_name = name, @c_duration = duration, @c_isavailable = isvisible from inserted -
@WEI_DBA:你是对的,我将变量 c_name 声明为 int 即使它是一个字符串(在我的例子中是 nvarchar)。我还有另一个错误。这将反映在问题的更新中。但我仍然收到与此类似的错误。
-
发布您更新的查询以及错误。
标签: sql-server database triggers