sql >> Base de Datos >  >> RDS >> Sqlserver

exportar datos de la tabla insertada a un archivo .txt en el servidor SQL

Puede crear otra tabla para almacenar temporalmente los resultados de INSERTED antes de llamar a 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

EDITAR: Aparentemente esto no funcionará, porque la tabla tempInserted está bloqueado en el momento bcp se llama.

Aquí hay una idea alternativa, tal vez no sea la solución más elegante, pero debería funcionar (si no está en la edición Express). Puede usar el activador solo para almacenar los datos insertados en esta tabla y puede crear un trabajo que se ejecute periódicamente (digamos cada 5 minutos) y leer de esa tabla, copiar en un archivo y eliminar.

Así que el disparador sería simplemente:

create trigger monitorTrigger on test 
AFTER insert 
as
BEGIN
  INSERT INTO test2.dbo.tempInserted
  SELECT * FROM INSERTED
END

y procedimiento almacenado para copiar en un archivo, que puede ejecutar desde el trabajo:

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