Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

exporter les données de table insérées vers un fichier .txt dans le serveur SQL

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