Я тоже много думал об этом. Многое зависит от конкретной базы данных, поэтому в зависимости от того, используете ли вы SQL2000 или SQL2005 +, вы будете использовать либо коды возврата, либо RAISERROR, либо TRY-CATCH в хранимой процедуре.
RAISERROR желательно возвращать коды, потому что разработчики, использующие хранимую процедуру, получают больше информации. Оптимально было бы выбрать номера 50000 и выше и зарегистрировать соответствующие сообщения, но это большая работа, чтобы просто передать то, что можно передать в тексте вызова RAISERROR
Код возврата не подлежит взаимодействию без чтения исходного кода хранимой процедуры. возвращаемое значение 0 может быть успешным, неудачным, затронутым 0 строками, только что сгенерированным первичным ключом, или что код возврата не был установлен в зависимости от прихотей создателя хранимой процедуры в тот день. Кроме того, ADO.NET возвращает количество строк из ExecuteNonQuery, поэтому некоторым разработчикам будет сложно быстро найти код возврата.
Специальные решения тоже плохие, например.
IF @@Error>0
SELECT 'Something bad happened'
Если у вас есть возможность использовать хранимые процедуры CLR, то в игру вступает обработка ошибок в стиле C #.
Поэтому добавьте RAISERROR в свои хранимые процедуры, затем перехватите SqlException, сообщите пользователю все, что действительно является проверкой ввода пользовательских данных, зарегистрируйте все, что разработчик злоупотребляет API, и, возможно, попытайтесь повторить попытку подключения или выполнения. таймауты.
IF @Foo =42
BEGIN
RAISERROR ( 'Paramater @foo can''t be 42',
16, -- Severity = Misc. User Error.
1 -- State. == ad hoc way of finding line of code that raised error
) ;
RETURN -1; --Just because some developers are looking for this by habit
END