Не совсем уверен, что вы делаете - что вам нужно для вызова этой GetOptimizedUuid
хранимой процедуры? Разве вы не можете просто использовать NEWID()
для получения нового GUID?
В любом случае - если у вас есть для вызова этой хранимой процедуры, я предполагаю, что вы вызовете ее один раз перед циклом, чтобы получить нужные вам идентификаторы - и затем вы получите top (1) UUID из таблицы и обновите одну строку в таблице базы данных - а затем вам также необходимо удалить тот UUID, который вы только что использовали, из временной таблицы, в противном случае вы продолжаете использовать повторно один и тот же идентификатор снова и снова ....
Попробуйте что-то вроде этого:
BEGIN
DECLARE @no INT;
DECLARE @i INT;
SET @no = (SELECT COUNT(id) FROM table1)
SET @i = 0;
-- define and fill the table *ONCE* and *BEFORE* the loop
DECLARE @TempUuid TABLE(SeqUuid UNIQUEIDENTIFIER, OptimizedUuid UNIQUEIDENTIFIER)
INSERT INTO @TempUuid
EXECUTE [Sample].[dbo].[GetOptimizedUuid]
-- declare a UUID to use
DECLARE @NewUuid UNIQUEIDENTIFIER;
WHILE @i < @no
BEGIN
-- get the first UUID from the temp table
SELECT TOP (1) @NewUuid = OptimizedUuid
FROM @TempUuid;
-- update your table
UPDATE table1
SET col2 = @NewUuid
WHERE col2 IS NULL;
-- *REMOVE* that UUID that you've used from the table
DELETE FROM @TempUuid
WHERE OptimizedUuid = @NewUuid;
SET @i = @i + 1;
END
END