【问题标题】:Create a Cursor and loop all users data创建光标并循环所有用户数据
【发布时间】:2016-10-30 14:59:19
【问题描述】:

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

请告诉我该怎么做。

【问题讨论】:

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


    【解决方案1】:

    试试这个。不要使用光标。非常多余。请记住,这是为了向您展示如何使用 WHILE LOOP 而不是使用 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
    

    【讨论】:

    • WHILE(SELECT COUNT(*) FROM #data) &gt; 0 是做什么的?我只想循环选择并显示数据。所以,我需要为此使用光标
    • 这是一个循环。你不需要光标。
    • 那么Do your changes here 做了什么。我不要任何操作,只需要选择语句
    • 我改了脚本
    • 问题。你想调用存储过程并循环记录吗?
    【解决方案2】:

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

               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
    

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2012-07-01
      • 1970-01-01
      • 2012-01-20
      • 2022-12-18
      • 2021-06-07
      • 2019-10-14
      • 1970-01-01
      • 2019-03-11
      相关资源
      最近更新 更多