Vous pouvez créer une autre table pour stocker temporairement les résultats de INSERTED
avant d'appeler 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
MODIF : Apparemment, cela ne fonctionnera pas, car la table tempInserted
est verrouillé au moment bcp
est appelé.
Voici une idée de contournement, peut-être pas la solution la plus élégante mais qui devrait fonctionner (si vous n'êtes pas sur l'édition express). Vous pouvez utiliser le déclencheur uniquement pour stocker les données insérées dans cette table et vous pouvez créer une tâche qui s'exécute périodiquement (toutes les 5 minutes, disons) et lire à partir de cette table, copier dans un fichier et supprimer.
Donc, le déclencheur serait juste :
create trigger monitorTrigger on test
AFTER insert
as
BEGIN
INSERT INTO test2.dbo.tempInserted
SELECT * FROM INSERTED
END
et procédure stockée à copier dans un fichier - que vous pouvez exécuter à partir du travail :
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