2010-07-30 6 views
0

Voici ma requête qui met à jour un enregistrement dans la table Utilisateur, je veux que la requête renvoie l'ID utilisateur qui a été mis à jour, Comment puis-je faire cela?requête serveur SQL pour renvoyer une valeur

  UPDATE USER 
      SET GroupID = @New_GroupID 
      FROM USER 
LEFT OUTER JOIN DOCUMENTS ON User.UserID = Documents.UserID 
      WHERE (Documents.UNC = @UNC) 
      AND (User.GroupID = @Old_GroupID) 

Répondre

2

[Scratch réponse précédente - Je lis INSERT plutôt que UPDATE]

Est-ce votre requête va toujours mettre à jour une seule ligne seulement?

Declare @ID int 

SELECT @ID=User.UserID 
FROM User 
LEFT OUTER JOIN Documents ON User.UserID = Documents.UserID 
WHERE  (Documents.UNC = @UNC) AND (User.GroupID = @Old_GroupID) 

UPDATE User 
Set GroupID = @New_GroupID 
Where UserID = @ID 

If @@RowCount = 1 
Return @ID 
Else 
Return -1 /* problem - multiple rows updated */ 
+0

+1: J'sais quelle version de SQL Server, valide question sur le nombre de valeurs susceptibles de revenir. –

0

Si UserId est votre Colum d'identité, ajoutez Select @@Scope_Identity après votre mise à jour de la déclaration actuelle.

Sinon, il vous suffit une petite modification:

Update User 
Set GroupID = @New_GroupID 
FROM User LEFT OUTER JOIN 
     Documents ON User.UserId = Documents.UserID 
WHERE Documents.UNC = @UNC AND User.GroupID = @Old_GroupID 

Select UserId from User where [YourIdentityColumn] = @@Scope_Identity 
+0

Est-ce que @@ Identity renvoie uniquement l'identité de la dernière ligne INSERTed? http://msdn.microsoft.com/en-us/library/ms187342.aspx – CJM

+1

[@@ SCOPE_IDENTITY] (http://msdn.microsoft.com/fr-fr/library/ms190315.aspx) est un meilleur choix –

+1

Ceci est une requête UPDATE - AFAIK Scope_Identity() et @@ Identity ne fonctionnent que sur INSERTS. – CJM

4

Pour SQL Server 2005+, vous pouvez utiliser le OUTPUT clause:

UPDATE USER 
    SET GroupID = @New_GroupID 
OUTPUT INSERTED.id AS ID 
    FROM USER u 
LEFT JOIN DOCUMENTS d ON d.userid = u.userid 
    WHERE d.UNC = @UNC 
     AND u.GroupID = @Old_GroupID 
+0

(+1) Ne jamais rencontrer la clause OUTPUT ... fonctionnait dans SQL2005/SQL2008 depuis assez longtemps, mais évidemment toujours verrouillé dans la pensée SQL2000! – CJM

+0

@CJM: Je ne connais pas non plus la clause OUTPUT - jusqu'à présent, j'aime l'équivalent d'Oracle, la clause RETURNING un peu plus. –

Questions connexes