Только потому, что произошла ошибка, это не останавливает выполнение сохраненного процесса.Вы не увидите сообщение об ошибке, потому что по умолчанию SSMS показывает таблицу результатов, пока запрос не завершит обработку.
Это показывает результаты в течение 10 секунд перед переключением на сообщение об ошибке:
RAISERROR('Error',16,1)
select top 1000 * from sys.objects so1,sys.objects so2,sys.objects so3
WAITFOR DELAY '00:00:10'
Если вы хотите, чтобы сохраненный процесс завершился досрочно, если произошла ошибка, вы должны выйти из системы пораньше.Вы можете переписать вставку так:
declare @cross_reference table (
context varchar(20) not null
, value1 varchar(10) not null
, value2 varchar(10) not null
)
insert into @cross_reference (context,value1,value2)
values ('map', 'from_value', 'to_value'),
('map', 'from_value', 'to_value'),
('map', 'from_value_xxxxx', 'to_value_xxxxxxx');
if @@ERROR !=0 or @@ROWCOUNT !=3 return
Или, если вы не знаете количество строк, измените условие на @@ROWCOUNT = 0
(или, конечно,, используйте TRY
/ CATCH
- но я сам еще не написал много кода, используя его, поэтому не могу просто привести пример)
Ваш текущий код сделал каждую вставку независимой - так чтовставки, которые могут работать, делать, а те, которые не могут, генерировать сообщения об ошибках.Затем он продолжает обработку вашего окончательного запроса.Поскольку таблица используется в LEFT JOIN, для конечного запроса, разумеется, не имеет значения, существуют ли любые строки в табличной переменной.