Câu hỏi hơi mơ hồ liên quan đến cách BCP được thực thi, bên ngoài nó được thực hiện trong Quy trình được lưu trữ. Nhưng vì đó là tất cả những gì chúng tôi thực sự biết vào lúc này, tôi sẽ cho rằng bạn đang gọi BCP.EXEtừ xp_cmdshell.
Nếu bạn chỉ muốn ghi lại các lỗi thực tế đang bị ném BCP, thì điều đó rất dễ thực hiện vì ERRORLEVELgiá trị được trả về dưới dạng INTtừ xp_cmdshellthủ tục được lưu trữ:
DECLARE @ErrorLevel INT;
EXEC @ErrorLevel = xp_cmdshell
N'BCP "SELECT * FROM sys.objects where 1= " queryout C:\temp\BCPtest.txt -T -w ';
SELECT @ErrorLevel;
Trả về:
1
Tuy nhiên, nếu bạn muốn xử lý các truy vấn hoàn thành thành công nhưng trả về 0 hàng là điều kiện "lỗi", thì điều đó cũng có thể được thực hiện, nó chỉ cần nỗ lực hơn một chút:
DECLARE @ErrorLevel INT;
EXEC @ErrorLevel = xp_cmdshell
N'BCP "SELECT * FROM sys.objects where 1= 0 " queryout C:\temp\BCPtest.txt -T -w && (FORFILES /P C:\TEMP\ /M BCPtest.txt /C "CMD /C IF @fsize LSS 3 DEL C:\TEMP\BCPtest.txt" & IF NOT EXIST C:\temp\BCPtest.txt EXIT -3)';
SELECT @ErrorLevel;
Trả về:
-3
Xin lưu ý rằng dòng lệnh dài cần phải được giữ dưới dạng một dòng đơn hoặc được đặt vào một .CMDtập lệnh để nó hoạt động chính xác.
Logic bổ sung, ở định dạng dễ đọc hơn, là:
&& (
FORFILES /P C:\TEMP\
/M BCPtest.txt
/C "CMD /C IF @fsize LSS 3 DEL C:\TEMP\BCPtest.txt"
& IF NOT EXIST C:\temp\BCPtest.txt EXIT -3
)
Giải trình: