【问题标题】:export inserted table data to .txt file in SQL server将插入的表数据导出到 SQL Server 中的 .txt 文件
【发布时间】:2013-09-05 05:34:13
【问题描述】:

我想将插入表的数据(临时表有表插入数据的注释)导出到.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中的插入表,有人知道吗?

【问题讨论】:

    标签: sql triggers sql-server-2012


    【解决方案1】:

    在调用bcp 之前,您可以创建另一个表来临时存储来自INSERTED 的结果。

    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
    

    【讨论】:

    • 我试过你的答案:我已经为测试表创建了触发器,就像你说的那样,我尝试在测试表中插入值,结果:它继续执行永远不会完成。
    • @niren - 显然表 tempInserted 在调用 bcp 时被锁定。瘸。检查更新以了解解决方法的想法。也许它可以为你工作。或者我不知道您打算如何处理该文件,但也许您可以在需要时运行 SP 来填充文件?
    【解决方案2】:

    我就是这么干的

    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
    

    【讨论】:

    • OP 必须决定脏读所涉及的风险是否会抵消收益。
    猜你喜欢
    • 2012-05-06
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多