То, что вы предлагаете, не может быть сделано в MSSQL (AFAIK). На самом деле, я сомневаюсь, что предложения по преобразованию GetSequence в функцию, вероятно, тоже не будут работать, поскольку последний ud_campaing_id, вероятно, хранится в некоторой «глобальной» таблице ...
Предполагая, что хранимая процедура GetSequence вызывается разными процессами "одновременно", я бы посоветовал вам либо
- необходимо адаптировать указанный sp, чтобы вы могли запрашивать сразу несколько кодов (дополнительный параметр, например, @number_of_ids, который по умолчанию равен 1), чтобы выходной параметр возвращал первый запрошенный идентификатор, но внутренне также резервировал следующие n для вас, который вы затем можете использовать для обновления @ list
- необходимо создать жесткий цикл, который будет получать количество идентификаторов, а затем применить их за один раз к вашей целевой таблице.
Хотя я, безусловно, поддерживаю первое решение, оно требует внесения изменений в то, что представляется самой основной хранимой процедурой, что может не понравиться или не позволить dba. Тем не менее, это сделало бы вещи НАМНОГО быстрее.
Второе решение все еще требует некоторого зацикливания, а также имеет некоторые серьезные требования к индексации при применении результирующих данных к конечной таблице, поэтому оно далеко от совершенства, но может быть, по крайней мере, немного быстрее, чем зацикливание непосредственно над целевая таблица и выборка и применение новой записи данных по записи.
Судя по подходу UPDATE @list, который вы используете, я думаю, вы уже в курсе второго предложения.
Предполагая, что у вас есть поле идентификации в @list (с ограничением UNIQUE OR PK на нем и без пробелов), вы можете попробовать что-то вроде этого:
DECLARE @RecordID, @LastRecordID int
DECLARE @new_UD_campaignID bigint
SELECT @RecordID = Min(RecordID),
@LastRecordID = Max(RecordID)
FROM @list
DECLARE @newCampaingIDs TABLE (RecordID int PRIMARY KEY, new_UD_campaignID varchar(8))
WHILE @RecordID <= @LastRecordID
BEGIN
EXEC ppGlobal.dbo.Getsequence 'ud_campaign_id', @new_UD_campaignID OUTPUT
INSERT @newCampaingIDs (RecordID, new_UD_campaignID) VALUES (@RecordID, RIGHT('00000000' + CAST(@new_UD_campaignID AS VARCHAR(8)), 8))
SELECT @RecordID = @RecordID + 1
END
UPDATE @list
SET OrderNum = (CASE WHEN corpCamp LIKE '%LEP%' THEN 'L' ELSE 'C' END) + new_UD_campaignID
FROM @list upd
JOIN @newCampaingIDs new
ON new.RecordID = upd.RecordID
Причина, по которой я думаю это будет быстрее, заключается в том, что последовательные вставки будут иметь (намного?) Меньше накладных расходов, чем обновление исходной записи таблицы по записи. С другой стороны, вы все еще застряли за неоднократным вызовом хранимого процесса GetSequence, который может быть вашим основным потребителем времени.
В любом случае, единственный способ узнать наверняка - это проверить его =)
Удачи.