Skieruj WYNIK instrukcji UPDATE na zmienną lokalną

12

Chciałbym to zrobić:

DECLARE @Id INT;

UPDATE Logins
SET    SomeField = 'some value'
OUTPUT @Id = Id
WHERE  EmailAddress = @EmailAddress -- this is a parameter of the sproc

Czy to w ogóle możliwe? Wiem, że mogę zadeklarować zmienną tabeli lokalnej i skierować tam dane wyjściowe, ale wolę je pominąć, jeśli to możliwe

Andrei Rînea
źródło

Odpowiedzi:

15

Nie, ponieważ potencjalnie masz OUTPUTwiele wierszy, które nie pasowałyby do zmiennej skalarnej.

Musisz wyprowadzać dane do @Tablezmiennej lub zadeklarowanej tabeli, aby obsłużyć wiele wierszy danych wyjściowych.

JNK
źródło
Tak. Nawet jeśli adres e-mail jest unikalny, nie można go zhakować za pomocą DML-a składającego się z jednego zadania SELECT. Rozumiem błąd "A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement."Jest to trochę niefortunne, ponieważ jest to naprawdę czyste rozwiązanie, gdy wiesz, że wpływasz tylko na jeden wiersz.
Jon Seigel,
Rozumiem. Mogę jednak powiedzieć SELECT @JNK = SomeColumn FROM SomeTable GDZIE SomeOtherColumn = MatchesMultipleRows ... Dlaczego więc nie zastosowano tego ograniczenia? W każdym razie dzięki, a ja po prostu zadeklaruję zmienną tabeli lokalnej i skończę z nią. Życie toczy się dalej. :)
Andrei Rînea,
0
declare @status_atividade bit;

update t1 set         
    t1.idioma = t2.idioma, 
    t1.regiao = t2.regiao, 
    t1.fuso_horario = t2.fuso_horario,
    @status_atividade = t2.status_atividade

from 
    @usuario as t1  
join 
    dbo.locatario as  t2 
on 
    t1.id_locatario = t2.id_locatario

select @status_atividade
Rangel Borene
źródło