Bạn có thể tạo một bảng khác để lưu trữ tạm thời các kết quả từ INSERTED
trước khi gọi bcp
.
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
CHỈNH SỬA: Rõ ràng điều này sẽ không hoạt động, vì bảng tempInserted
bị khóa tại thời điểm bcp
được gọi là.
Đây là một ý tưởng thay thế, có thể không phải là giải pháp thanh lịch nhất nhưng sẽ hiệu quả (nếu bạn không sử dụng phiên bản nhanh). Bạn có thể sử dụng trình kích hoạt chỉ để lưu trữ dữ liệu đã chèn vào bảng này và bạn có thể tạo một công việc chạy định kỳ (giả sử cứ sau 5 phút) và đọc từ bảng đó, sao chép vào tệp và xóa.
Vì vậy, trình kích hoạt sẽ chỉ là:
create trigger monitorTrigger on test
AFTER insert
as
BEGIN
INSERT INTO test2.dbo.tempInserted
SELECT * FROM INSERTED
END
và Thủ tục đã lưu trữ để sao chép vào tệp - mà bạn có thể chạy từ công việc:
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