Dirigez la SORTIE d'une instruction UPDATE vers une variable locale

12

Je voudrais faire ceci:

DECLARE @Id INT;

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

Est-ce seulement possible? Je sais que je peux déclarer une variable de table locale et y diriger la sortie, mais je préférerais la sauter si possible

Andrei Rînea
la source

Réponses:

15

Non, car vous pouvez potentiellement OUTPUTting plusieurs lignes, qui ne rentreraient pas dans une variable scalaire.

Vous devez effectuer une sortie dans une @Tabletable variable ou déclarée pour gérer plusieurs lignes de sortie.

JNK
la source
Oui. Même si l'adresse e-mail est unique, il n'est pas possible de la pirater à l'aide de DML composable et d'une seule affectation SELECT. Je reçois l'erreur "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."C'est un peu malheureux car c'est une solution vraiment propre quand vous savez que vous n'affectez qu'une seule ligne.
Jon Seigel
Je comprends. Cependant, je peux dire SELECT @JNK = SomeColumn FROM SomeTable OERE SomeOtherColumn = MatchesMultipleRows ... Alors pourquoi cette contrainte n'a-t-elle pas été appliquée ici? Quoi qu'il en soit, merci et je vais simplement déclarer une variable de table locale et en finir avec elle. La vie continue. :)
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
la source