Обновление с помощью курсора в SQL Server 2008 R2 - PullRequest
5 голосов
/ 20 апреля 2011

Я хочу обновить столбец в определенной таблице с именем Employeekopie1.

Я пытаюсь обновить столбец FK_Profiel (значения типа int)

значения, которые я пытаюсь вставить в столбец FK_Profiel - это значения, которые я получаю от курсора.Курсор получает значения из столбца в другой таблице, используя соединения для получения правильных значений.

Результат используемого запроса на выборку возвращает несколько строк с разными значениями.

Первый результатиз запроса на выборку 114, что является правильным.Проблема в том, что это значение присваивается всем полям в столбце FK_Profiel, что не является моим намерением.

Я хочу назначить все значения из запроса выбора.

код выглядит следующим образом:

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;

Пожалуйста, помогите, спасибо.

Ответы [ 4 ]

11 голосов
/ 20 апреля 2011

Вы забыли добавить 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
4 голосов
/ 20 апреля 2011

Прежде всего вам не нужно 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
1 голос
/ 09 июля 2012
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
0 голосов
/ 13 апреля 2012
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
...