Обновление столбца, содержащего несколько строк со значением uniqueidentifier

#sql-server #database

#sql-сервер #База данных

Вопрос:

Позвольте мне начать с извинений, поскольку это может быть глупый вопрос. Предполагается, что у меня есть UPDATE столбец с uniqueidentifier типом данных, скажем, столбцы таблицы (id, username, pwd, Uuid), где Uuid находится uniqueidentifier столбец.

Этот Uuid столбец имеет несколько нулевых значений. Я должен обновить это, сгенерировав версию uuid v1 из внешней хранимой процедуры.

Я попробовал что-то вроде приведенного ниже кода, но это не работает. (GetOptimizedUuid SP генерирует Uuid V1)

 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 [dbo].[GetOptimizedUuid]

    UPDATE table1  
    SET Uuid = (SELECT OptimizedUuid 
                FROM @TempUuid) 
    WHERE Uuid IS NULL AND LIMIT 1, @no;

    SET @i = @i   1;
END
  

Если в нем 7 записей и только 2 записи имеют значение Uuid, как мне обновить, чтобы оставшиеся 5 записей Uuid имели другое значение? Заранее спасибо!

Комментарии:

1. можете ли вы также поделиться внутри процедуры GetOptimizedUuid?

2. @SerkanArslan Я не должен обновлять из-за политики моей компании, он просто возвращает два варианта идентификаторов uuid, один из которых сгенерирован, а другой оптимизирован для дополнительной безопасности.

Ответ №1:

Вы можете попробовать это.

 DECLARE @affectedrows INT;

SET @affectedrows = 1;

WHILE @affectedrows > 0  
BEGIN
    DECLARE @TempUuid TABLE (SeqUuid UNIQUEIDENTIFIER,  
                             OptimizedUuid UNIQUEIDENTIFIER)

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

    UPDATE TOP(1) table1  
    SET Uuid = (SELECT TOP 1 OptimizedUuid 
                FROM @TempUuid) 
    WHERE Uuid IS NULL 

    SET @effectedeows = @@ROWCOUNT

END
  

Комментарии:

1. он просто обновляет одну запись за выполнение и выдает эту ошибку: сообщение 512, уровень 16, состояние 1, подзапрос строки 15 вернул более 1 значения. Это не разрешено, когда следует подзапрос =, !=, <, <= , >, >= или когда подзапрос используется как выражение. Оператор был завершен. Есть ли способ это исправить?