Обновление пустых записей таблицы путем вызова хранимой процедуры выдает ошибку «Подзапрос возвратил более одного значения» - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь обновить все нулевые значения столбца с помощью Uuid (созданного с помощью хранимой процедуры GetOptimizedUuid).При этом я получаю сообщение об ошибке

Подзапрос возвратил более 1 значения

Я мог понять причины ошибки, но ни одно из моих исправлений не помогло.

Я пробовал с некоторыми циклами, но это не исправляет

BEGIN
    DECLARE @no INT;
    DECLARE @i INT;

    SET @no = (SELECT COUNT(id) FROM table1)
    SET @i = 0;

    WHILE @i < @no  
    BEGIN
        DECLARE @TempUuid TABLE(SeqUuid UNIQUEIDENTIFIER, OptimizedUuid UNIQUEIDENTIFIER)

        INSERT INTO @TempUuid
            EXECUTE [Sample].[dbo].[GetOptimizedUuid]

        UPDATE table1  
        SET col2 = (SELECT OptimizedUuid FROM @TempUuid) 
        WHERE col2 IS NULL;

        SET @i = @i + 1;
    END
END

Помогите разобраться с этим, спасибо!

1 Ответ

0 голосов
/ 16 апреля 2019

Не совсем уверен, что вы делаете - что вам нужно для вызова этой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...