У меня есть стол. Таблица должна хранить множество значений о местоположении, поэтому изначально я только две колонки без увеличивающимся колонки, что дает следующее:TSQL Insert Conundrum
RefID | TypeID
1 | 1
1 | 3
1 | 6
2 | 3
3 | 5
3 | 6
В случае, если первый столбец является опорным для местоположения, а второй фактические значения.
Проблема заключалась в том, как я могу решить, какое значение нужно дать для первого столбца. Идея у меня есть, чтобы добавить поле автоинкрементного, чтобы генерировать эти значения таким образом, я бы следующие данные вместо:
ID | RefID | TypeID
1 | 1 | 1
2 | 1 | 3
3 | 1 | 6
4 | 4 | 3
5 | 5 | 5
6 | 5 | 6
Так колонка AutoNumber (колонок 1) действует в качестве затравки для опорного столбца.
У меня есть две проблемы - копирование значения столбца идентификатора в ссылочный столбец и возврат ссылочного значения в приложение, чтобы его можно было использовать, если для местоположения более одного значения.
Я пришел с этой хранимой процедуры:
CREATE PROCEDURE [dbo].[AddCaseType]
(
@TypeID INTEGER,
@CaseID INTEGER = NULL OUT
)
AS
BEGIN
INSERT INTO
dbo.CaseTypeList(RefID, TypeID)
VALUES
(ISNULL(@CaseID,SCOPE_IDENTITY()), @TypeID)
Set @CaseID = SCOPE_IDENTITY()
END
GO
IsNull проверки на NULL на CaseID и если оно равно нулю, чтобы использовать значение SCOPE_IDENTITY()
. Однако SCOPE_IDENTITY
оценивается до вставки и, таким образом, возвращает последнее генерируемое удостоверение, а не новое.
Я не могу использовать уникальное значение из связанной таблицы, так как мне нужно полное отслеживание, если пользователь редактирует значения.
Так что я знаю, что хочу, но просто не имею знаний или опыта для этого.
Итак, чтобы инкапсулировать: Как создать уникальное значение для первого элемента набора и вернуть это значение, чтобы я мог повторно использовать его для остальной части этого набора?
Также вы можете ответить, если есть другой, более простой способ. Пожалуйста, помните - я новичок в материалах SQL, поэтому мне нужно понять, почему что-то происходит, потому что мне может понадобиться изменить его в будущем.
Обновление: После взятия кофе я заметил ошибку в коде - результат изменения трех столбцов, поэтому [ID] становится RefID в первой части инструкции INSERT. Это также отменяет некоторые из кода и, таким образом, частично изменяет характер моей проблемы. Извините за путаницу, это может вызвать.
@Graham: Можете ли вы добавить заголовки столбцов на таблицы образцов? –
@ Майкл Харен. Готово. Также я заметил ошибку в моем коде, которая делает недействительной часть моей проблемы. –
@Graham: Я обновил свой ответ, чтобы надеяться зафиксировать ваши изменения. Примечание по адресу @@ Identity или Scope_Identity(): он извлекает значение, которое * совсем недавно * было вставлено в желаемую область действия, а не значение * next *. Вот почему в моем ответе я сам генерирую номер внутри транзакции. –