【问题标题】:Issue with While Loop with Nested While loop using SQL Server 2016使用 SQL Server 2016 的带有嵌套 While 循环的 While 循环问题
【发布时间】:2023-10-30 14:10:01
【问题描述】:

我正在使用 SQL Server 2016 并使用 NESTED WHILE LOOPS 在杂草中迷路。 在 INNER WHILE LOOP 中,我正在填充一个包含 PolicyNo 和 ClaimNo 的 TEMP 表 (#tempClaimRecordsForInsert)。有 773 条记录。 TEMP 表可以正确填充,没有问题。
问题出在 OUTER WHILE LOOP 中,我试图填充另一个 TEMP 表,我试图从内部循环中创建的临时表(有 16 个 UserSysID 记录)中向每个 UserSysID 添加 773 个声明。我没有在 TEMP 表 (#tempRecordsForInsert) 中获得所有记录的任何记录。 任何帮助/方向将不胜感激。谢谢。

这是我的 SQL 代码:

DECLARE @counterUserID int = 1;
DECLARE @counterClaims int = 1;
CREATE TABLE #tempClaimRecordsForInsert (
    PolicyNo varchar(10)
    , ClaimNo varchar(6)
);
CREATE TABLE #tempRecordsForInsert (
    ReinsuranceAuditSysID int
    , PolicyNo varchar(10)
    , ClaimNo varchar(6)
)

WHILE @counterUserID <= (SELECT COUNT(*) FROM #tempAuditorUserIdList)
    BEGIN
        DECLARE @UserSysID int = (SELECT l.UserSysID FROM #tempAuditorUserIdList l WHERE l.RN = @counterUserID);

        WHILE @counterClaims <= (SELECT COUNT(*) FROM #ClaimNo)
            BEGIN
                DECLARE @RN1 int = (SELECT c.RN FROM #ClaimNo c WHERE c.RN = @counterClaims);

                INSERT INTO #tempClaimRecordsForInsert
                SELECT c.PolicyNo, c.ClaimNo --, x.RN
                FROM dbo.CMS_Claims c
                INNER JOIN #ClaimNo x
                ON c.ClaimNo = x.ClaimNo
                WHERE x.RN = @RN1;

                SET @counterClaims = (@counterClaims + 1)
            END

    INSERT INTO #tempRecordsForInsert
    SELECT @UserSysID as ReinsuranceAuditSysID, i.ClaimNo, i.PolicyNo
    FROM #tempClaimRecordsForInsert i
    WHERE @UserSysID = @counterUserID

    SET @counterUserID = (@counterUserID + 1)
END

SELECT * FROM #tempClaimRecordsForInsert;
DROP TABLE #tempClaimRecordsForInsert;
SELECT * FROM #tempRecordsForInsert;
DROP TABLE #tempRecordsForInsert;

【问题讨论】:

  • 在#tempClaimRecordsForInsert 中您只插入PolicyNo 和ClaimNo,但您可能需要UserSysID 与外部插入条件中的@countUserID 进行比较
  • 杰维,谢谢。我会试试看。谢谢
  • 我的意思是你需要在 #tempClaimRecordsForInsert 中的一些东西来与外部插入条件下的计数器进行比较,可能 UserSysID 是正确的

标签: tsql while-loop


【解决方案1】:

不看表数据很难知道,但是如果你在#tempClaimRecordsForInsert中有UserSysId,那么外插入的where子句应该是:

 UserSysID = (SELECT l.UserSysID FROM #tempAuditorUserIdList l WHERE l.RN = @counterUserID)

【讨论】:

  • Jayvee,感谢您花时间看这个。 #tempAuditorUserIdList 表中的数据是 UserSysID 列中的 INT 值列表,您正确的是 RN(是行号)和 UserSysID 不同。你的建议是正确的。不幸的是,这并没有帮助我得到任何结果。还是谢谢。
  • 我更新了答案,我认为如果您设法将 usersysid 带到#tempClaimRecordsForInsert 那么您可以为外部插入创建 where 子句,就像我将它放在答案中一样
【解决方案2】:

@Jayvee,我终于能够解决我的问题,但再次感谢您花时间查看我的问题。下面是解决问题的代码。我不必将@UserSysID 放入我很感激的#tempClaimRecordsForInsert 中。我找到了使用 SQL Server 2016 中的 SSMS 调试器逐步执行我的代码的答案。如果其他人有同样的问题,以下是代码:

CREATE TABLE #tempClaimRecordsForInsert (
    PolicyNo varchar(10)
    , ClaimNo varchar(6)
);
CREATE TABLE #tempRecordsForInsert (
    ReinsuranceAuditSysID int
    , PolicyNo varchar(10)
    , ClaimNo varchar(6)
);

DECLARE @counterUserID int = 1;
DECLARE @counterClaims int = 1;

WHILE @counterUserID <= (SELECT COUNT(*) FROM #tempAuditorUserIdList)
    BEGIN
        DECLARE @UserSysID int = (SELECT l.UserSysID FROM #tempAuditorUserIdList l WHERE l.RN = @counterUserID);
    
            WHILE @counterClaims <= (SELECT COUNT(*) FROM #ClaimNo)
                BEGIN
                    DECLARE @RN1 int = (SELECT c.RN FROM #ClaimNo c WHERE c.RN = @counterClaims);

                    INSERT INTO #tempClaimRecordsForInsert
                    SELECT c.PolicyNo, c.ClaimNo 
                    FROM dbo.CMS_Claims c
                    INNER JOIN #ClaimNo x
                    ON c.ClaimNo = x.ClaimNo
                    WHERE x.RN = @RN1;

                    SET @counterClaims = (@counterClaims + 1)
                END
                
        INSERT INTO #tempRecordsForInsert
        SELECT @UserSysID as ReinsuranceAuditSysID, i.PolicyNo, i.ClaimNo
        FROM #tempClaimRecordsForInsert i
        WHERE @UserSysID = (SELECT l.UserSysID FROM #tempAuditorUserIdList l WHERE l.RN = @counterUserID)

        SET @counterUserID = (@counterUserID + 1);
    END

SELECT * FROM #tempClaimRecordsForInsert ORDER BY ClaimNo asc;
SELECT * FROM #tempRecordsForInsert ORDER BY ReinsuranceAuditSysID asc, ClaimNo asc;
DROP TABLE #tempClaimRecordsForInsert;
DROP TABLE #tempRecordsForInsert;

【讨论】: