whizkidgps Ответов: 1

SQL сервер - сделать запись типа


Я пытаюсь получить данные из пользовательского типа таблицы, значения которой должны быть вставлены в родительскую и дочернюю таблицы. В приведенной ниже хранимой процедуре я использую отдельный оператор SELECT для получения значений из пользовательской таблицы и вставки в родительскую и дочернюю таблицы. Не могли бы вы помочь мне со следующими вопросами?

1) вместо использования двух операторов select, есть ли возможность использовать один оператор SELECT для получения столбцов, которые требуются из пользовательской таблицы?

2) я использую Commit &Rollback Tran. Если какое-либо исключение при вставке записи в родительскую таблицу будет поймано блоком, но значение идентификатора будет пропущено на единицу. Например. У меня есть 3 записи в пользовательской таблице и получаю ошибку при обработке 2-й записи. Значение столбца идентификатора родительской таблицы для 1-й и 3-й записей должно быть “101 & 102”, но оно вставляется как “101 & 103”.

3) предложите мне любой другой альтернативный подход, доступный для вставки записи в родительскую\дочернюю таблицу из пользовательской таблицы для получения статуса каждой вставки, будь то успех или неудача.

Что я уже пробовал:

Создайте процедуру [dbo].[SP_Insert]
@insertTable [dbo].[UserDefindTable] только для чтения
АС
НАЧАТЬ
--Получение Общего Количества Записей
DECLARE @totalRecords int = isnull((select count(1) from @insertTable), 0)
--Показания счетчика на время..петля
Объявить @counter int = 1
--Получение значения столбца идентификатора из родительской таблицы
Объявите @IdentityColumn как int
--Возвращаемая таблица со статусом Success\Failure
DECLARE @returnTable TABLE (ID INT identity(1, 1),[resultId] varchar(50),isSuccess bit)
Объявить @KeyValue VARCHAR(50)

WHILE (@counter <= (@totalRecords))
НАЧАТЬ

SET @KeyValue = (SELECT TOP 1 [KeyValue] FROM @insertTable where [row_id] = @counter)
НАЧИНАЙ ПРОБОВАТЬ

НАЧИНАЙ ТРАН
--Вставить в родительскую таблицу
Вставить в [родительскую таблицу] (Col2,Col3,Col4,Col5)
(Выберите Col2,Col3,Col4,Col5 из @insertTable, где [row_id] = @counter)
SET @IdentityColumn = SCOPE_IDENTITY()

--Вставить в дочернюю таблицу
Вставить в [ChildTable] (Col1, Col6, Col7)
(Выберите @IdentityColumn, KeyValue, Col7 из @insertTable, где [row_id] = @counter)

--Вставить в таблице результатов
Вставить @returnTable ([значения],isSuccess) значения (@значения, 1)

СОВЕРШИТЬ ТРАН
КОНЕЦ ПОПЫТКИ
НАЧИНАЙ ЛОВИТЬ
ОТКАТ ТРАНА
--Вставить в таблице результатов
Вставить @returnTable ([значения],isSuccess) значения (@значения, 0)
КОНЦЕВАЯ ЗАДВИЖКА
SET @counter = @counter + 1
КОНЕЦ
Выберите * из @returnTable
КОНЕЦ

1 Ответов

Рейтинг:
0

Gerry Schmitz

Я бы не беспокоился о частях, которые "работают" (превращение 2 выборок в 1).

https://blog.sqlauthority.com/2014/10/08/sql-server-reset-the-identity-seed-after-rollback-or-error/[^]