Sql server SQL将多条记录插入到触发的表中
在SQL代理作业中,我正在从主表(X)下载数据。如果状态等于'WW'或'WXY',我只想将所有记录插入到我已创建触发器的另一个表(Y)中。你能给我一些建议,我应该在我的触发器定义中改变什么吗?尝试向DB2.Y表插入多条记录时收到错误消息(代理作业失败) 第一个代码(下载新数据) 触发代码:Sql server SQL将多条记录插入到触发的表中,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,在SQL代理作业中,我正在从主表(X)下载数据。如果状态等于'WW'或'WXY',我只想将所有记录插入到我已创建触发器的另一个表(Y)中。你能给我一些建议,我应该在我的触发器定义中改变什么吗?尝试向DB2.Y表插入多条记录时收到错误消息(代理作业失败) 第一个代码(下载新数据) 触发代码: USE DB2 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[TriggerName] ON Y A
USE DB2
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[TriggerName] ON Y
AFTER INSERT AS
DECLARE @SERV varchar(40)
DECLARE @STATUS varchar(3)
SET @SERV=(SELECT [SERV] FROM inserted)
SET @STATUS=(SELECT [STATUS] FROM inserted)
IF @STATUS in ('WW', 'WXY')
BEGIN
DECLARE @MSG varchar(500)
SET @MSG = 'Job "' + @SERV + '" failed!!!'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'myemail@domain.com', @body= @MSG, @subject = @MSG, @profile_name = 'profilename'
END
您可以使用光标来解决错误。下面的光标在所有插入的记录上迭代,状态为
WW
或WXY
,并为每个记录发送电子邮件
DECLARE error_cursor CURSOR FOR
SELECT [SERV],[STATUS] FROM inserted
WHERE [STATUS] in ('WW', 'WXY')
OPEN error_cursor
FETCH NEXT FROM error_cursor
INTO @SERV, @STATUS
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE MSG varchar(500)
SET @MSG = 'Job "' + @SERV + '" failed!!!'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'myemail@domain.com', @body= @MSG, @subject = @MSG, @profile_name = 'profilename'
FETCH NEXT FROM vendor_cursor
INTO @SERV, @STATUS
END
CLOSE error_cursor;
DEALLOCATE error_cursor;
对于多行插入,INSERTED可以包含多行-它在每个操作中运行一次,而不是每行运行一次 请尝试这样的触发器:
USE DB2
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[TriggerName] ON Y
AFTER INSERT AS
DECLARE @SERV varchar(40)
DECLARE @STATUS varchar(3)
IF EXISTS(SELECT [Status] FROM Inserted WHERE [STATUS] in ('WW', 'WXY'))
BEGIN
DECLARE @MSG varchar(8000)
INSERT INTO JobLog(Serv, Status)
SELECT Serv, Status FROM Inserted WHERE [STATUS] in ('WW', 'WXY')
SET @MSG = CAST(@@ROWCOUNT as nvarchar) + 'Job(s) failed - see log for details'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'myemail@domain.com', @body= @MSG, @subject = @MSG, @profile_name = 'profilename'
END
SELECT
试试这样的
CREATE TRIGGER [dbo].[TriggerName] ON Y
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SERV varchar(40),@STATUS varchar(3), @MSG varchar(500)
Select [SERV], [STATUS] INTO #Temp
FROM inserted
Where [STATUS] IN ('WW', 'WXY')
Declare Cur CURSOR FOR
SELECT [SERV], [STATUS] FROM #Temp
OPEN Cur
FETCH NEXT FROM Cur INTO @SERV, @STATUS
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MSG = 'Job "' + @SERV + '" failed!!!'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'myemail@domain.com'
, @body= @MSG
, @subject = @MSG
, @profile_name = 'profilename'
FETCH NEXT FROM Cur INTO @SERV, @STATUS
END
CLOSE Cur
DEALLOCATE Cur
END
插入的
可以包含多条记录,而您的代码当前无法处理这些记录。
CREATE TRIGGER [dbo].[TriggerName] ON Y
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SERV varchar(40),@STATUS varchar(3), @MSG varchar(500)
Select [SERV], [STATUS] INTO #Temp
FROM inserted
Where [STATUS] IN ('WW', 'WXY')
Declare Cur CURSOR FOR
SELECT [SERV], [STATUS] FROM #Temp
OPEN Cur
FETCH NEXT FROM Cur INTO @SERV, @STATUS
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MSG = 'Job "' + @SERV + '" failed!!!'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'myemail@domain.com'
, @body= @MSG
, @subject = @MSG
, @profile_name = 'profilename'
FETCH NEXT FROM Cur INTO @SERV, @STATUS
END
CLOSE Cur
DEALLOCATE Cur
END