Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę uruchomić wyzwalacz na każdym wstawionym wierszu podczas INSERT INTO Table (itp.) SELECT * FROM Table2?

Wyzwalacz wstawiania jest wywoływany raz w przypadku wstawiania zbiorczego, ale w wyzwalaczu można użyć specjalnego inserted tabela, aby uzyskać wszystkie wstawione wiersze.

Wyobraź sobie więc, że masz wyzwalacz wstawiania, taki jak ten, który rejestruje wszystkie wiersze wstawione do table

create trigger trgInsertTable 
on dbo.table
for insert
as
   insert tableLog(name)
    select name from inserted

Za pomocą tego wyzwalacza podczas zbiorczego wstawiania w table , tableLog jest wypełniona taką samą liczbą wierszy, jaka została wstawiona do table

Dla konkretnego wyzwalacza, ponieważ musisz wywołać procedurę składowaną dla każdego wiersza, musisz użyć kursora:

ALTER TRIGGER dbo.Notify
    ON  dbo.Table
    AFTER INSERT
AS 
BEGIN

    DECLARE @EmailSender varchar(50)='Sender Profile'
    DECLARE @User varchar(20)
    DECLARE @Subject varchar(50)

    DECLARE cursor CURSOR FOR
      SELECT User, '(' + CONVERT(varchar, Id) + ')!'
        FROM inserted

    OPEN cursor
    FETCH NEXT FROM cursor INTO @User, @Subject
    WHILE @@FETCH_STATUS = 0
    BEGIN
      exec msdb.dbo.sp_send_dbmail
          @[email protected],
          @[email protected]
          @[email protected],
          @body='//etc'
      FETCH NEXT FROM cursor INTO @User, @Subject
    END
    CLOSE cursor
    DEALLOCATE cursor

END

Nie testowałem, ale powinienem działać



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zainstalować SQL Server Manager Studio (SSMS) — samouczek SQL Server / TSQL, część 1

  2. SQL Server - Nieprawidłowe znaki w nazwach parametrów

  3. Generuj losowe nazwy w sql

  4. Framework Entity bardzo wolno ładuje się po raz pierwszy po każdej kompilacji

  5. Sql Query do grupowania danych z dwóch tabel