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