创建一个游标并循环所有用户数据
Create a Cursor and loop all users data
我有一个 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
请告诉我如何操作。
试试这个。不要使用游标。非常多余。请记住,这是为了向您展示如何使用 WHILE 循环而不是使用 CURSORS 进行教育。 SQL 格式不正确,语法可以大大改进。但这只显示了如何循环。
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
如果您试图从另一个存储过程中获取结果集。
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
我有一个 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
请告诉我如何操作。
试试这个。不要使用游标。非常多余。请记住,这是为了向您展示如何使用 WHILE 循环而不是使用 CURSORS 进行教育。 SQL 格式不正确,语法可以大大改进。但这只显示了如何循环。
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
如果您试图从另一个存储过程中获取结果集。
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