I am trying to loop through a table using a 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
That above returns taskResourceOID and EvUserOID. If I need to output a table with the @TaskOID and the respective taskResourceOID and EvUserOID, what is the best way to do it?
Use a temporary table or a table variable..
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
Or even better, don't use a cursor (this can be performed as a select, but I leave this up to you... Just wanted to show how to use a cursor AND a table as return value)
Without having tested, this should work without using a cursor:
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
USE [Demo_03]
GO
/****** Object: StoredProcedure [dbo].[SP_Salrafer_BiACT_SOr] Script Date: 06-Apr-2021 11:32:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- =============================================
ALTER PROCEDURE [dbo].[SP_SaTsfer_Bind_SOthr]
(
@SalaryDate DATE=NULL
)
AS
BEGIN
DECLARE
@EmpCode bigint=null,
CREATE TABLE #TempSalaDetail
(
EmpCode bigint,
)
/**End Region**/
/**Create Temp Table For Fetch Billing Details For Reports**/
CREATE TABLE #TempFinalSalaryDetail
(
EmpCode bigint,
EmpName nvarchar(500),
)
/**End Region**/
DECLARE @TempSiteCursor CURSOR
DECLARE @TempSiteFinalCursor CURSOR
INSERT INTO #TempSalaryDetail
(
EmpCode
)
(
SELECT EmpCode,
FROm tbl_SalRegi WHERE
)
SET @TempSiteFinalCursor=CURSOR FOR SELECT EmpCodeFROM #TempSalaryDetail
OPEN @TempSiteFinalCursor
FETCH NEXT FROM @TempSiteFinalCursor INTO @EmpCode
WHILE @@FETCH_STATUS=0
BEGIN
SET @AccountNo=(SELECT AccountNo FROM tbl_Emps_Account WHERE EmpAccId=@EmpAcId )
INSERT INTO #TempFinalSalaryDetail
(
EmpCode,
)
VALUES
(
@EmpCode,
)
FETCH NEXT FROM @TempSiteFinalCursor INTO @EmpCode,
END
SELECT EmpCode,
EmpName,
FROM #TempFinalSalaryDetail
order by case when BankId=1 then 0 else 2 end, BankId asc, EmpCode asc
DEALLOCATE @TempSiteFinalCursor
DROP TABLE #TempSalaryDetail
DROP TABLE #TempFinalSalaryDetail
END
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.