Можете да създадете друга таблица за временно съхраняване на резултатите от INSERTED
преди да извикате 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
РЕДАКТИРАНЕ: Очевидно това няма да работи, защото таблицата tempInserted
е заключен в момента bcp
се нарича.
Ето една идея за заобиколно решение, може би не най-елегантното решение, но трябва да работи (ако не използвате експресно издание). Можете да използвате тригер само за съхраняване на вмъкнатите данни в тази таблица и можете да създадете задание, което да се изпълнява периодично (да речем на всеки 5 минути) и да чете от тази таблица, да копира във файл и да изтрива.
Така че тригерът ще бъде просто:
create trigger monitorTrigger on test
AFTER insert
as
BEGIN
INSERT INTO test2.dbo.tempInserted
SELECT * FROM INSERTED
END
и съхранена процедура за копиране във файл - която можете да стартирате от заданието:
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