通过SQL Server 2008中的触发器使用bcp
问题描述:
触发器的目的是在将数据插入到表中后,使用bcp从表中导出特定数据,所以我认为这样做是因为我知道触发器等待bcp,它正在等待要释放的表上的一个锁,但该锁保持到触发器之后,因此它不起作用。我该怎么做?或者我需要添加一些功能或东西的作品?通过SQL Server 2008中的触发器使用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
答
不要在触发器使用bcp
。即使你能使它工作,它也会减慢数据库的速度,可能会导致数据库无法使用。 bcp
是一个命令行实用程序,应被视为一个
我建议你使用一个SQL Server Agent到定期或触发的基础上执行额外的动作
您还可以阅读this的教程,这将有助于您开始使用代理
如果您没有SQL Server代理(Express不包括它),然后你有一些其他选项:
- 写自己的代理。 Here is an example
- 插入后调用存储过程。 This answer使用的方法来解决类似的问题,给你贴
- 使用存储过程来写入数据的一个并处理出口代号
- 使用上日程的计划任务处理数据(这是
bcp
可以不杀死使用服务器性能)
答
不知道这是否会工作,但你可以尝试更改为INSTEAD OF触发器和触发
我怀疑内做INSERT和bcp这可能会绕开桌子上的锁。
+0
感谢您的帮助,我更改为INSTEAD OF,但它是相同的,当我执行触发器时,它挂起... –
嗨,SQL Server代理上可用的SQL Server代理? –
不幸的不是。我会用替代方案更新我的答案 –