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

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