0

我想将插入表的数据(临时表有表插入数据的注释)导出到.txt文件,我在触发器中使用了这样

create trigger monitorTrigger on test 
for insert 
as
declare @sql varchar(8000)

SELECT @sql = 'bcp "select * from inserted" queryout I:\File\mytest.txt -c -t -T -S YAMUNA\SQLEXPRESS'

exec xp_cmdshell @sql

go

这不起作用,因为我没有给出插入表的完整上下文(意味着 database.shemaName.tableName)。但是相同的代码正在使用普通表,因为我给出了完整的上下文

declare @sql varchar(8000)

SELECT @sql = 'bcp "select * from test2.dbo.test" queryout I:\File\mytest.txt -c -t -T -S YAMUNA\SQLEXPRESS'

exec xp_cmdshell @sql

我不知道如何查询插入的表bcp,有人知道吗?

4

2 回答 2

0

您可以创建另一个表来临时存储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
于 2013-09-06T07:29:30.327 回答
-1

我是这样工作的

create trigger monitorTrigger on test 
for insert 
as
declare @sql varchar(8000)

SELECT @sql = 'bcp "select * from inserted **with (nolock)**" queryout I:\File\mytest.txt -c -t -T -S YAMUNA\SQLEXPRESS'

exec xp_cmdshell @sql

于 2016-09-20T10:31:23.247 回答