在sql server 2008中通过触发器使用bcp

时间:2017-03-09 16:49:51

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

触发器的目的是在该表上插入数据后使用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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

我建议您使用SQL Server Agent按计划或触发的方式执行额外操作

您还可以阅读有助于您开始使用代理

this教程

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

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