Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL将多条记录插入到触发的表中_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql server SQL将多条记录插入到触发的表中

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

在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
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