我试图使用游标遍历一个表:
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
Run Code Online (Sandbox Code Playgroud)
上面的代码返回taskResourceOID和EvUserOID。如果我需要输出带有@TaskOID以及各自的taskResourceOID和EvUserOID的表,什么是最好的方法?
使用临时表或表变量。
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
Run Code Online (Sandbox Code Playgroud)
甚至更好的是,不要使用游标(可以选择执行此操作,但是我留给您...只是想展示如何使用游标和表作为返回值)
| 归档时间: |
|
| 查看次数: |
5750 次 |
| 最近记录: |