将插入的表数据导出到SQL Server中的.txt文件

时间:2013-09-05 05:34:14

标签: sql triggers sql-server-2012

我想将插入表的数据(临时表有表的插入数据的注释)导出到.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中查询插入的表格,任何人都有任何想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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