У меня есть простая таблица стран, использующая столбец идентификаторов для первичного ключа. Существуют также столбцы, содержащие двухбуквенные и трехбуквенные коды стран ISO-3166. Каждый из этих столбцов определяется как уникальный индекс.
При вставках / обновлениях я хочу просто уведомить пользователя, если введенный код ISO уже используется. Я полагаюсь на исключение базы данных для запуска процесса. Я не хочу перегружать пользователей техническими подробностями. Я просто хочу сказать ему, что введенное значение ISO не может быть использовано.
Вот T-SQL в сохраненном обновлении Proc, который я написал. Это кажется длинным и склонным к будущим ошибкам и / или постоянному обслуживанию, поскольку приложение растет и все меняется. Есть ли лучший или более простой способ? Я мог бы быть немного мокрым за ушами с .net, но я думал, что это будет легче.
BEGIN TRY
UPDATE [Country] SET [CountryName] = @CountryName, [CountryISO] = @CountryISO, [CountryISO3] = @CountryISO3, [UpdateDate] = @updateDate WHERE (([CountryID] = @CountryID) AND ([RowVersion] = @Original_RowVersion));
END TRY
BEGIN CATCH
DECLARE @ErrSeverity int, @ErrNumber int, @ErrLine int
DECLARE @ErrMsg nvarchar(4000)
SELECT @ErrSeverity = ERROR_SEVERITY(), @ErrNumber = ERROR_NUMBER(),@ErrState = ERROR_STATE(),
@ErrMsg =
CASE WHEN ERROR_NUMBER() = 2601
THEN
CASE
WHEN ISNULL(CHARINDEX('IX_COUNTRYISO3', ERROR_MESSAGE()), 0) > 0
THEN 'The 3 letter ISO-3166 value entered is already in use. Please enter a unique 3 letter ISO-3166 value.'
WHEN ISNULL(CHARINDEX('IX_COUNTRYISO', ERROR_MESSAGE()), 0) > 0
THEN 'The 2 letter ISO-3166 value entered is already in use. Please enter a unique 2 letter ISO-3166 value.'
ELSE
ERROR_MESSAGE() + '(SQL ErrNo: ' + CONVERT(varchar(50), ERROR_NUMBER()) + ')'
END
ELSE
ERROR_MESSAGE() + '(SQL ErrNo: ' + CONVERT(varchar(50), ERROR_NUMBER()) + ')'
END;
RAISERROR(@ErrMsg, @ErrSeverity, @ErrState)
END CATCH
Является ли мое решение жизнеспособным?
Каков наилучший способ поделиться этим кодом исключения между StoredProcs для вставки и обновления?
Полагаю, я прошу пересмотреть код.
Большое спасибо, Майк