繁体   English   中英

创建一个游标并循环所有用户数据

[英]Create a Cursor and loop all users data

我有一个Stored procedure ,该Stored procedure为我提供了如下记录。

SC

现在我想要的是。 我想为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 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

如果您尝试从另一个存储过程获取结果集。

           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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM