如何解决SQL Server触发器问题
我已经创建了如下的SQL Server触发器。
create trigger testtrigger on testdb
for insert
as
declare @sql varchar(8000)
SELECT @sql = 'bcp "select * from testdb" queryout c:/test.txt -c -t -T -S localhost'
exec xp_cmdshell @sql
go
但是当在testdb中插入一行时,将创建文本文件,但是没有内容。有人可以帮我解决这个问题。
解决方法
除了关于不使用该方法的建议之外,我还要问您是否确定插入操作已完成。
最可能的情况是,您面临一个死锁,并且由于涉及的资源之一超出了SQL范围(命令行),因此SQL无法处理这种死锁。>
问题是,当您完成插入操作时,将触发触发器,而不会释放在testtrigger
中获得的排他锁。然后尝试在testtrigger
上进行选择,但由于仍然存在锁定,因此选择需要等待这些锁被释放,这将永远不会发生,因为您没有在等待选择时关闭事务。>
因此创建了文件,但是由于死锁,插入和选择从未完成。 通过将更新命令添加到以下内容,您将看到它的作用:
'bcp "select * from inserted with(nolock)" queryout c:/test.txt -c -t -T -S localhost'
当然,不建议您采用整个方法,但希望它能帮助您了解情况。
,尝试在AFTER INSERT之后创建触发器,然后从“插入的”伪表导出,而不是从实际的表“ testdb”导出。新插入的行将被导出。
create trigger testtrigger on testdb
after insert
as
if exists (select * from inserted)
begin
declare @sql varchar(8000),@guidName char(36)=newid();
SELECT @sql = concat('bcp "select * from inserted" queryout c:/',@guidName,'.txt -c -t -T -S localhost');
exec xp_cmdshell @sql
end
go
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。