【问题标题】:Using bcp through a trigger in sql server 2008通过 sql server 2008 中的触发器使用 bcp
【发布时间】:2017-07-30 18:30:42
【问题描述】:

触发器的目的是在表上插入数据后用bcp从表中导出特定数据,所以我想这样做,我知道触发器等待bcp,即等待锁定要释放的表,但该锁一直保留到触发器之后,因此它不起作用。我该怎么做?还是我需要添加一些功能或其他东西才能起作用?

我使用的是 SQL Server 2008。

ALTER TRIGGER [TRIGGER] on [TABLE] after INSERT AS BEGIN 
   DECLARE @CMD NVARCHAR(1000) 
   SET @CMD = 'cd.. && "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" "SELECT TOP 1 CODE FROM[TABLE] WITH (NOLOCK)   ORDER BY ID DESC" queryout "\\FOLDER\FOLDER\FILE.txt" -T -c -S "[SERVERNAME]"'
   EXEC master..XP_CMDSHELL @CMD 
END

【问题讨论】:

    标签: sql-server-2008 bcp xp-cmdshell


    【解决方案1】:

    不要在触发器中使用bcp。即使你可以让它工作,它也会减慢你的数据库,可能到它无法使用的地步。 bcp 是一个命令行实用程序,应被视为一个实用程序

    我建议您使用 SQL Server Agent 在计划或触发的基础上执行额外操作

    您还可以阅读 this 教程,这将帮助您开始使用代理

    如果您没有 SQL Server 代理(Express 不包含它),那么您还有其他一些选择:

    • 编写您自己的代理。 Here is an example
    • 插入后调用存储过程。 This answer 使用该方法解决了与您发布的类似的问题
    • 使用存储过程写入数据并处理导出代码
    • 使用计划任务按计划处理数据(这是可以使用bcp 而不影响服务器性能的地方)

    【讨论】:

    • 您好,SQL Server Express 版本是否提供 SQL Server 代理?
    • 很遗憾没有。我会用替代品更新我的答案
    【解决方案2】:

    不确定这是否可行,但您可以尝试更改为 INSTEAD OF 触发器并在触发器中执行 INSERT 和 bcp

    我怀疑这可能会绕过桌子上的锁。

    进一步阅读 - http://www.c-sharpcorner.com/UploadFile/37db1d/creating-and-managing-triggers-in-sql-server-20052008/

    【讨论】:

    • 谢谢你的帮助,我改成INSTEAD OF,但是还是一样,当我执行触发器的时候,它就挂了……
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多