2010-07-30 4 views
0

Ниже мой запрос, который обновляет запись в таблице User, я хочу, чтобы запрос возвращал UserId, который был обновлен. Как я могу это сделать?sql server query для возврата значения

  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) 

ответ

2

[Царапины предыдущий ответ - я прочитал INSERT вместо UPDATE]

Ваш запрос всегда будет обновить только одну строку?

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: Незнайка, какая версия SQL Server, действительный вопрос о том, сколько значений можно ожидать вернуть. –

0

Если UserId ваша идентичность Колум, добавьте Select @@Scope_Identity после текущего оператора обновления.

Если нет, то вам нужно всего лишь небольшой модификации:

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

Действительно ли @@ Identity возвращает идентификатор последней строки INSERTed? http://msdn.microsoft.com/en-us/library/ms187342.aspx – CJM

+1

[@@ SCOPE_IDENTITY] (http://msdn.microsoft.com/en-us/library/ms190315.aspx) является лучший выбор –

+1

Это запрос UPDATE - AFAIK Scope_Identity() и @@ Identity работают только с INSERTS. – CJM

4

Для SQL Server 2005+, вы можете использовать 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) Никогда не сталкивался с предложением OUTPUT ... работал в SQL2005/SQL2008 достаточно долго, но, очевидно, все еще заблокирован в мышлении SQL2000! – CJM

+0

@CJM: Я тоже не знаком с предложением OUTPUT - до сих пор мне нравится эквивалент Oracle, предложение «RETURNING» немного больше. –