Sql 如何使用循环将数据增量更新到另一个表中?

Sql 如何使用循环将数据增量更新到另一个表中?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个问题是这样的: CREATE TABLE #Employee (Id INT, Name NVARCHAR(100), Status TINYINT) GO INSERT INTO #Employee ( Id, Name, Status) Values (1, 'Basavaraj Biradar', 0), (2, 'Shree Biradar', 0), (3, 'Kalpana Biradar', 0) GO DECLARE @LoopCount

我有一个问题是这样的:

CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, 'Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, 'Kalpana Biradar', 0)
GO

DECLARE @LoopCounter INT = 1, @MaxEmployeeId INT = 10 , 
        @EmployeeName NVARCHAR(100)

WHILE(@LoopCounter <= @MaxEmployeeId)
BEGIN
   SELECT @EmployeeName = (Name)
   FROM #Employee WHERE Id = @LoopCounter


   SET @LoopCounter  = @LoopCounter  + 1     
    PRINT @EmployeeName     
END
DECLARE @LoopCounter INT = 1, @MaxEmployeeId INT = 10 , 
        @EmployeeName NVARCHAR(100), @AnotherCounter INT = 1

WHILE(@AnotherCounter <= @MaxEmployeeId)
BEGIN
   SELECT @EmployeeName = (Name)
   FROM #Employee WHERE Id = @LoopCounter

   IF @LoopCounter >= (SELECT COUNT(*) FROM #Employee)
         SET @LoopCounter = 1
   ELSE
      SET @LoopCounter  = @LoopCounter  + 1 

    PRINT @EmployeeName
    SET @AnotherCounter = @AnotherCounter + 1     
END

DROP TABLE #employee
预期产出:

1 Basavaraj Biradar
2 Shree Biradar
3 Kalpana Biradar
4 Basavaraj Biradar
5 Shree Biradar
6 Kalpana Biradar
7 Basavaraj Biradar
8 Shree Biradar
9 Kalpana Biradar
10 Basavaraj Biradar
11 Shree Biradar
12 Kalpana Biradar

由于表中有3行,SELECT语句只运行3次。之后,它会一直打印@EmployeeName变量,直到循环中断。由于表中的最后一条记录在EmployeeName列中有“Kalpana Biradar”,因此在后续迭代中不会对其进行更改,因此每次都打印相同的字符串

要对表中的实际记录数执行循环,可以修改代码以将@MaxEmployeeId设置为:

SELECT @MaxEmployeeId = COUNT(*) FROM #Employee
编辑:

由于要在到达终点后从第一条记录开始,代码应如下所示:

CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, 'Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, 'Kalpana Biradar', 0)
GO

DECLARE @LoopCounter INT = 1, @MaxEmployeeId INT = 10 , 
        @EmployeeName NVARCHAR(100)

WHILE(@LoopCounter <= @MaxEmployeeId)
BEGIN
   SELECT @EmployeeName = (Name)
   FROM #Employee WHERE Id = @LoopCounter


   SET @LoopCounter  = @LoopCounter  + 1     
    PRINT @EmployeeName     
END
DECLARE @LoopCounter INT = 1, @MaxEmployeeId INT = 10 , 
        @EmployeeName NVARCHAR(100), @AnotherCounter INT = 1

WHILE(@AnotherCounter <= @MaxEmployeeId)
BEGIN
   SELECT @EmployeeName = (Name)
   FROM #Employee WHERE Id = @LoopCounter

   IF @LoopCounter >= (SELECT COUNT(*) FROM #Employee)
         SET @LoopCounter = 1
   ELSE
      SET @LoopCounter  = @LoopCounter  + 1 

    PRINT @EmployeeName
    SET @AnotherCounter = @AnotherCounter + 1     
END

DROP TABLE #employee

这可以在没有WHILE循环或光标的情况下完成。您只需要一个:

结果:

| Rn |              Name |
|----|-------------------|
|  1 | Basavaraj Biradar |
|  2 |     Shree Biradar |
|  3 |   Kalpana Biradar |
|  4 | Basavaraj Biradar |
|  5 |     Shree Biradar |
|  6 |   Kalpana Biradar |
|  7 | Basavaraj Biradar |
|  8 |     Shree Biradar |
|  9 |   Kalpana Biradar |
| 10 | Basavaraj Biradar |
| 11 |     Shree Biradar |
| 12 |   Kalpana Biradar |

您将需要两个循环。外部循环定义重复次数,而内部循环将打印表中所有可用的名称。 试试这个-

CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, 'Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, 'Kalpana Biradar', 0)
GO

DECLARE @OuterLoopCounter INT = 1, 
        @InnerLoopCounter INT=1,
        @MaxEmployeeID INT,
        @EmployeeName nvarchar(100)

WHILE @OuterLoopCounter <= 4 -- Change to whatever value
BEGIN
   SELECT @MaxEmployeeID = MAX(ID) FROM #Employee
   WHILE @InnerLoopCounter <= @MaxEmployeeID
   BEGIN
        SELECT @EmployeeName = Name
        FROM #Employee WHERE Id = @InnerLoopCounter
        PRINT @EmployeeName 
        SET @InnerLoopCounter  = @InnerLoopCounter  + 1     
   END
   SET @InnerLoopCounter = 1
   SET @OuterLoopCounter =@OuterLoopCounter +1
END

既然@MaxEmployeeId=10,那么它是否应该最多为10?数据应该插入到另一个表中,最多为10万条,但这三条记录应该重复,如Output所示@MaxEmployeeId的用途是什么?您到底想做什么?由于您已为@EmployeeName分配了一个值,最后分配的值将被重新打印,直到满足条件为止WHILE@LoopCounterMaxEmployeeId只给出数字如果我想要100000条记录,我会在那里修改,只是@FelixPamittanit给出了相同的结果没有发生什么,你需要再次从第一条记录开始。我正在编辑我的回答。这将进入无限循环,只需编辑我的答案。然而,我仍然不清楚你为什么需要这个。我相信有更好的方法来达到你的目的。我需要插入50万条记录检查我的脚本无论如何感谢你的回答…我对loopsyeah很困惑,它给出了结果,但它同时打印了3次相同的记录,然后我需要的其他记录,如上面的输出,它给出了准确的数据,但需要一个示例“Basavaraj Biradar”重复3次,然后是我需要的其他记录,比如Basavaraj Biradar下一张Shree Biradar下一张其他记录,然后再次重复相同的记录,你确定吗?你看过SQL FIDLE了吗?是的,它正在工作如果需要为同一个表创建50万条记录,那么我需要修改1我需要扩展它们如果你想限制要生成的记录数,修改第一个查询的MaxEmployeeId。如果要指定记录必须重复的次数,请修改第二个查询的@RepeatTimes。
CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, 'Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, 'Kalpana Biradar', 0)
GO

DECLARE @OuterLoopCounter INT = 1, 
        @InnerLoopCounter INT=1,
        @MaxEmployeeID INT,
        @EmployeeName nvarchar(100)

WHILE @OuterLoopCounter <= 4 -- Change to whatever value
BEGIN
   SELECT @MaxEmployeeID = MAX(ID) FROM #Employee
   WHILE @InnerLoopCounter <= @MaxEmployeeID
   BEGIN
        SELECT @EmployeeName = Name
        FROM #Employee WHERE Id = @InnerLoopCounter
        PRINT @EmployeeName 
        SET @InnerLoopCounter  = @InnerLoopCounter  + 1     
   END
   SET @InnerLoopCounter = 1
   SET @OuterLoopCounter =@OuterLoopCounter +1
END