2012-01-20 3 views
1

Я пытаюсь Переберите в таблице с помощью курсора:SQL Server - Cursor

DEClARE @ProjectOID as nvarchar (100) 
DECLARE @TaskOID as nvarchar (100) 
DECLARE TaskOID_Cursor FOR 
SELECT TaskOID FROM ProjectOID_Temp 
OPEN TaskOID_Cursor 
FETCH NEXT FROM TaskOID_Cursor INTO @TaskOID 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT t1.OID as taskResourceOID, t2.OID as EvUserOID 
    FROM (select OID, resourceOID from taskresourcehours 
    where projecttaskoid = @TaskOID) as t1, 
    (
    select OID, workerOID 
    from Evuser 
    where workerOID in 
     (select resourceOID from taskresourcehours where projecttaskoid = @TaskOID) 
    ) as t2 
    WHERE t1.resourceOID = t2.workerOID 
FETCH NEXT FROM TaskOID_Cursor 
INTO @TaskOID 
END 
CLOSE TaskOID_Cursor 
DEALLOCATE TaskOID_Cursor 

Это выше возвращает taskResourceOID и EvUserOID. Если мне нужно вывести таблицу с помощью @TaskOID и соответствующего taskResourceOID и EvUserOID, что это лучший способ сделать это?

+0

у вас есть синтаксис ERR или в 'DECLARE TaskOID_Cursor FOR', отсутствующий тип – Matten

+2

Почему вы используете курсоры вместо обычного соединения, когда нормальное соединение будет намного быстрее? –

+0

«Каков наилучший способ сделать это?» Не используйте курсор. Похоже, вы должны быть в состоянии сделать это без. –

ответ

3

Используйте временную таблицу или табличную переменную ..

DEClARE @ProjectOID as nvarchar (100) 
DECLARE @TaskOID as nvarchar (100) 
DECLARE @retTable TABLE (
    TaskOID nvarchar(100), 
    TaskResourceOID nvarchar(100), 
    EvUserOID nvarchar(100) 
) 
DECLARE TaskOID_Cursor CURSOR FOR 
SELECT TaskOID FROM ProjectOID_Temp 
OPEN TaskOID_Cursor 
FETCH NEXT FROM TaskOID_Cursor INTO @TaskOID 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO @retTable 
     SELECT @TaskOID,t1.OID as TaskResourceOID, t2.OID as EvUserOID 
     FROM (
     select OID, resourceOID from taskresourcehours 
     where projecttaskoid = @TaskOID) as t1, 
     ( 
      select OID, workerOID 
      from Evuser 
     and workerOID in -- this must be AND and not a second WHERE 
      (select resourceOID from taskresourcehours where projecttaskoid = @TaskOID) 
     ) as t2 
     WHERE t1.resourceOID = t2.workerOID 
FETCH NEXT FROM TaskOID_Cursor 
INTO @TaskOID 
END 
CLOSE TaskOID_Cursor 
DEALLOCATE TaskOID_Cursor 

SELECT * FROM @retTable 

Или еще лучше, не используйте курсор (это может быть выполнено как выбрать, но я оставляю это до вас .. . Просто хотел показать, как использовать курсор и таблицу в качестве возвращаемого значения)

+0

Hi Matten - это часть многошагового подхода для исправления некоторых ошибок в данных в соответствии с рекомендациями поставщика приложений. Есть ли способ вставить @TaskOID тоже в таблицу вывода вместе с TaskResourceOID и EvUserOID. Я ищу временную таблицу с TaskOID | TaskResourceOID | EvUserOID –

+0

@RK Kuppala без проблем, просто добавьте ее в таблицу (я принял свой ответ на редактирование) – Matten

+0

@ Matten - замечательно! Большое спасибо!! –

2

без испытав, это должно работать без использования курсора:

DECLARE @retTable TABLE (
    TaskResourceOID nvarchar(100), 
    EvUserOID nvarchar(100) 
) 

INSERT INTO @retTable 
SELECT 
    t1.OID as taskResourceOID, 
    t2.OID as EvUserOID 
FROM 
    ProjectOID_Temp pt, 
    (select OID from taskresourcehours where projecttaskoid = pt.TaskOID) as t1, 
    (select OID from Evuser where workerOID in (select resourceOID from taskresourcehours where projecttaskoid = pt.TaskOID)) as t2 
WHERE t1.resourceOID = t2.workerOID 
Смежные вопросы