SQL Server - курсор - PullRequest
       1

SQL Server - курсор

2 голосов
/ 20 января 2012

Я пытаюсь перебрать таблицу, используя курсор:

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, каков наилучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 20 января 2012

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

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

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

2 голосов
/ 20 января 2012

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...