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.EXE
từ 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ì ERRORLEVEL
giá trị được trả về dưới dạng INT
từ xp_cmdshell
thủ 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 .CMD
tậ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: