Нетрудно предоставить информационные сообщения об ошибках, понятные человеку. Просто RAISERROR с описательным текстом. Немного сложнее поднять локализованные тексты, что предполагает правильное использование sp_addmessage и семейства. Реальная трудная проблема - это ошибка, на которую может реагировать программа. Это означает правильно документированные коды ошибок ( и серьезность и состояние) и строгую дисциплину кода при использовании их в вашем API.
И не забывайте правильное вложение транзакций. В моем блоге есть пример того, как правильно обрабатывать транзакции в сочетании с исключениями T-SQL: Обработка исключений и вложенные транзакции .
К сожалению, современное состояние всего стека клиент / T-SQL в отношении исключений имеет некоторые проблемы. Наиболее примечательным является то, что если вы перехватываете исключение T-SQL, вы не можете перебросить его, поэтому ваш клиент не может ожидать типичных чисел системных ошибок. См. SQL Server: Возврат исключения с исходным номером исключения . Это оставляет вам мало средств для передачи правильной информации об ошибках, кроме использования ваших собственных номеров ошибок в диапазоне более 50000, что очень громоздко, так как увеличивается число «преобразованных» кодов ошибок, и использование строки сообщения об ошибке в качестве информации об исключении .