2011-04-20 66 views
5

我想更新名爲Employeekopie1的特定表中的列。使用SQL Server 2008 R2中的遊標更新

我想更新的列是FK_Profiel(值int型)

我試圖把在列FK_Profiel的值是我從遊標得到 值。遊標正在從不同表中的列中獲取值,並使用連接來獲取正確的值。

使用的select查詢的結果返回具有不同值的多行。

選擇查詢的第一個結果是114,這是正確的。問題是這個值被分配到列FK_Profiel列中的所有字段,這不是我的意圖。

我想分配select查詢中的所有值。

的代碼如下:

DECLARE @l_profiel int; 
DECLARE c1 CURSOR 
FOR select p.ProfielID 
from DIM_Profiel p,DIM_EmployeeKopie1 e1,employee e 
where e1.EmpidOrigineel = e.emplid and e.profile_code = p.Prof_Code 
for update of e1.FK_Profiel; 
open c1; 
FETCH NEXT FROM c1 into @l_profiel 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET NOCOUNT ON; 
     UPDATE DIM_EmployeeKopie1 
     set FK_Profiel = @l_profiel 
     where current of c1 

end 

close c1; 
deallocate c1; 

請幫幫忙,THX。

回答

11

您忘了將FETCH NEXT添加到循環中。

但是你根本不需要光標。

試試這個:

UPDATE e1 
SET  FK_Profiel = p.ProfielID 
FROM DIM_EmployeeKopie1 e1 
JOIN employee e 
ON  e.emplid = e1.EmpidOrigineel 
JOIN DIM_Profiel p 
ON  p.Prof_Code = e.profile_code 
+0

好了,你打我吧。 +1。 – Lamak 2011-04-20 14:38:50

+0

Woow thx的答案。這解決了我的問題。 – user717316 2011-04-21 07:31:59

+0

行動中的優雅,+1 – Paceman 2016-06-08 03:39:37

4

第一AF一切,你不需要爲這個CURSOR,你可以做一個UPDATE離不開它。而且你也應該使用明確的JOINS而不是隱式的。請嘗試以下操作:

UPDATE e1 
SET FK_Profiel = p.ProfielID 
FROM DIM_EmployeeKopie1 e1 
JOIN employee e 
ON e1.EmpidOrigineel = e.emplid 
JOIN DIM_Profiel p 
ON e.profile_code = p.Prof_Code 
+0

+1。使用遊標是因爲要求服務器速度較慢,並且缺乏面向集合的思維。 – TomTom 2012-07-09 14:11:57

-1
This is the simplest example of the SQL Server Cursor. I have used this all the time for any use of Cursor in my T-SQL. 

DECLARE @AccountID INT 
DECLARE @getAccountID CURSOR 
SET @getAccountID = CURSOR FOR 
SELECT Account_ID 
FROM Accounts 
OPEN @getAccountID 
FETCH NEXT 
FROM @getAccountID INTO @AccountID 
WHILE @@FETCH_STATUS = 0 
BEGIN 
PRINT @AccountID 
FETCH NEXT 
FROM @getAccountID INTO @AccountID 
END 
CLOSE @getAccountID 
DEALLOCATE @getAccountID 
1
DECLARE @employee_id INT 
DECLARE @getemployee_id CURSOR 

SET @getemployee_id = CURSOR FOR 
    SELECT employee_id 
    FROM employment_History 

OPEN @getemployee_id 
FETCH NEXT FROM @getemployee_ID 
INTO @employee_ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @employee_ID 
    FETCH NEXT FROM @getemployee_ID 
    INTO @employee_id 
END 

CLOSE @getemployee_ID 
DEALLOCATE @getemployee_ID