Để ghi lại thông tin khi chạy 1 đoạn script trong SQL server - vì mục đích debug hoặc log, chúng ta thường sử dụng PRINT, có một phương án thay thế thường ít được dùng hơn, và được dùng nhiều trong xử lý lỗi, đó là RAISERROR, mình nghĩ lý do nhiều vì cách đặt tên.
Hãy cùng so sánh 2 đoạn code sau để thấy sự khác biệt:
declare @i int = 1
while @i < 100
begin
print @i
waitfor delay '00:00:01'
set @i=@i+1
end
![](https://www.vndba.net/content/images/2021/09/image-8.png)
code 1
declare @i int = 1
while @i < 100
begin
raiserror ('%d',0,1, @i) with nowait
waitfor delay '00:00:01'
set @i=@i+1
end
![](https://www.vndba.net/content/images/2021/09/image-7.png)
code 2
Khi run đoạn code 1 bạn sẽ thấy messages in ra theo batch và đoạn code 2 messages sẽ in theo thời gian thực. Nếu bạn cần debug theo thời gian thực hoặc cần theo dõi sát sao script khi nó đang chạy, RAISERROR ... WITH NOWAIT có lẽ là sự lựa chọn tốt hơn, còn nếu bạn chỉ muốn xem lại log sau khi script chạy xong, PRINT sẽ đơn giản và tiện dụng hơn.
Ngoài ra, đúng theo cái tên RAISERROR, lệnh này còn dùng cho mục đích catch lỗi hoặc tự định nghĩa lỗi và trả về cho Stored procedure/script đã gọi nó, thường dùng với cấu trúc TRY...CATCH.