Możesz utworzyć kolejną tabelę do tymczasowego przechowywania wyników z INSERTED
przed wywołaniem bcp
.
create trigger monitorTrigger on test
AFTER insert
as
declare @sql varchar(8000)
--delete it every time
TRUNCATE TABLE test2.dbo.tempInserted
--populate it from inserted
INSERT INTO test2.dbo.tempInserted
SELECT * FROM INSERTED
--use it in bcp
SELECT @sql = 'bcp "select * from test2.dbo.tempInserted" queryout I:\File\mytest.txt -c -t -T -S YAMUNA\SQLEXPRESS'
exec xp_cmdshell @sql
EDYTUJ: Najwyraźniej to nie zadziała, ponieważ tabela tempInserted
jest zablokowany w czasie bcp
nazywa się.
Oto pomysł na obejście, może nie najbardziej eleganckie rozwiązanie, ale powinno działać (jeśli nie masz edycji ekspresowej). Możesz użyć wyzwalacza tylko do przechowywania wstawionych danych do tej tabeli i możesz utworzyć zadanie, które będzie uruchamiane okresowo (powiedzmy co 5 minut) i odczytuje z tej tabeli, kopiuje do pliku i usuwa.
Tak więc wyzwalacz byłby po prostu:
create trigger monitorTrigger on test
AFTER insert
as
BEGIN
INSERT INTO test2.dbo.tempInserted
SELECT * FROM INSERTED
END
i Stored Procedure do skopiowania do pliku - które można uruchomić z zadania:
CREATE PROC transferToFile
AS
BEGIN
declare @sql varchar(8000)
SELECT @sql = 'bcp "select * from test2.dbo.tempInserted" queryout I:\File\mytest.txt -c -t -T -S YAMUNA\SQLEXPRESS'
exec xp_cmdshell @sql
--delete at the end
TRUNCATE TABLE test2.dbo.tempInserted
END