Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

exportar os dados da tabela inserida para o arquivo .txt no servidor SQL


Você pode criar outra tabela para armazenar temporariamente os resultados de INSERTED antes de chamar 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, isso não funcionará, porque a tabela tempInserted está bloqueado no momento bcp é chamado.

Aqui está uma ideia de solução alternativa, talvez não seja a solução mais elegante, mas deve funcionar (se você não estiver na edição expressa). Você pode usar o gatilho apenas para armazenar os dados inseridos nesta tabela e pode criar um trabalho que é executado periodicamente (a cada 5 minutos, digamos) e ler a partir dessa tabela, copiar para o arquivo e excluir.

Então o gatilho seria apenas:
create trigger monitorTrigger on test 
AFTER insert 
as
BEGIN
  INSERT INTO test2.dbo.tempInserted
  SELECT * FROM INSERTED
END

e Stored Procedure para copiar para o arquivo - que você pode executar a partir do trabalho:
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