2011-04-20 62 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