我有一个Stored procedure
给我提供如下记录。
现在我想要的是。我想为SP创建一个CURSOR
,为每个用户循环并获取记录。
以下是我的SP。
ALTER PROCEDURE GET_INWARD_REMINDER_REPORT
AS
BEGIN
Select distinct
U.first_name + ' ' + U.last_name UserName,
TH.*,
CASE
WHEN TL.U_datetime < DATEADD(d, -5, GETDATE())
THEN M.Reporting_To
ELSE NULL
END Reporting_1
from inward_doc_tracking_trl TL
INNER JOIN inward_doc_tracking_hdr TH
ON TH.mkey = TL.ref_mkey
INNER JOIN user_mst U
ON TH.User_Id = U.mkey
INNER JOIN emp_mst M
ON M.mkey = U.employee_mkey
where TL.NStatus_flag NOT IN (5,14)
and TL.U_datetime < DATEADD(d, -3, GETDATE())
END
GO
请让我知道如何做到这一点。
答案 0 :(得分:1)
试试这个。不要使用CURSORS。非常多余。请记住,这是教育方面向您展示如何使用WHILE LOOP而不是使用CURSORS。 SQL格式不正确,可以大大改进SYNTAX。但这显示了如何仅循环。
ALTER PROCEDURE GET_INWARD_REMINDER_REPORT
AS
BEGIN
DECLARE @userName VARCHAR(512)
CREATE TABLE #ReportData
(
UserName VARCHAR(128),
MKey VARCHAR(64),
...................
)
Select distinct
U.first_name + ' ' + U.last_name UserName,
TH.*,
CASE
WHEN TL.U_datetime < DATEADD(d, -5, GETDATE())
THEN M.Reporting_To
ELSE NULL
END Reporting_1
INTO #data
from inward_doc_tracking_trl TL
INNER JOIN inward_doc_tracking_hdr TH
ON TH.mkey = TL.ref_mkey
INNER JOIN user_mst U
ON TH.User_Id = U.mkey
INNER JOIN emp_mst M
ON M.mkey = U.employee_mkey
where TL.NStatus_flag NOT IN (5,14)
and TL.U_datetime < DATEADD(d, -3, GETDATE())
WHILE(SELECT COUNT(*) FROM #data) > 0
BEGIN
SELECT TOP 1 @userName = UserName
FROM #data
INSERT INTO #ReportData
SELECT *
FROM #Data
WHERE UserName = @userName
DELETE #data
WHERE UserName = @userName
END
SELECT *
FROM #ReportData
DROP TABLE #ReportData
DROP TABLE #Data
END
GO
答案 1 :(得分:0)
如果您尝试从另一个存储过程获取结果集。
ALTER PROCEDURE GET_INWARD_REMINDER_REPORT
AS
BEGIN
DECLARE @userName VARCHAR(512)
CREATE TABLE #Data
(
UserName VARCHAR(128),
MKey VARCHAR(64),
...................
)
INSERT INTO #Data
EXEC StoredProcedureName
WHILE(SELECT COUNT(*) FROM #data) > 0
BEGIN
SELECT TOP 1 @userName = UserName
FROM #data
SELECT *
FROM #Data
WHERE UserName = @userName
SELECT @userName
DELETE #data
WHERE UserName = @userName
END
DROP TABLE #Data
END
GO