SQL: значение автоинкремента во время вставки - PullRequest
3 голосов
/ 04 января 2012

У меня есть существующая таблица, по которой по какой-то причине дизайнер решил вручную управлять значением первичного ключа, сохраняя последнее использованное значение в отдельной таблице (изменение таблицы для использования Identity сейчас не вариант).

Теперь мне нужно выполнить массовое обновление этой таблицы следующим образом:

DECLARE @NeedFieldID int
SET @NeedFieldID = 62034

    INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale)
    (
        SELECT 
            DISTINCT n.NeedID, 
                @NeedFieldID + 1,           
            'DetailedOutcome',
            999,
            'Detailed Outcome',
            'Select appropriate reason for a No Sale outcome',
            'T',
            'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined', 
            0
        FROM  T_L_Need n
            INNER JOIN T_L_NeedField nf
                ON n.NeedID = nf.NeedID
        WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0)
    )

Очевидно, что @NeedFieldID + 1 'не работает (просто использовать его, чтобы показать, что я хочуделать).Как я могу увеличить @NeedFieldID, когда SQL вставляет значения для каждого отдельного NeedId?Я использую SQL Server 2008.

1 Ответ

5 голосов
/ 04 января 2012

Вы хотите row_number():

DECLARE @NeedFieldID int
SET @NeedFieldID = 62034

    INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale)
    (
        SELECT 
            DISTINCT n.NeedID, 
                @NeedFieldID + row_number() over (order by n.NeedID),           
            'DetailedOutcome',
            999,
            'Detailed Outcome',
            'Select appropriate reason for a No Sale outcome',
            'T',
            'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined', 
            0
        FROM  T_L_Need n
            INNER JOIN T_L_NeedField nf
                ON n.NeedID = nf.NeedID
        WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0)
    )

Однако лучше всего сделать NeedFieldID столбец идентификаторов и просто позволить SQL Server сделать всю работу за вас.

...