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

时间:2016-06-28 10:22:54

标签: sql sql-server stored-procedures sql-server-2005 cursor

我有一个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

请让我知道如何做到这一点。

2 个答案:

答案 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