SQL Server中While循环条件插入数据异常,循环变量未递增求解
问题排查与修正方案
错误原因分析
- 内层
WHILE循环未对@i进行修改,一旦进入循环就会无限执行插入操作,导致外层循环的@i无法继续递增,程序陷入死循环 - 第二个内层循环的条件
@i > 26 AND @i <565遗漏了@i=26的场景,不符合需求中1-26的IsScience为1的要求 - 完全不需要嵌套
WHILE循环,需求仅需根据@i的范围做分支判断
修正后的WHILE循环代码
BEGIN DECLARE @i int = 0 WHILE @i < 565 BEGIN SET @i = @i + 1 -- 根据当前序号判断IsScience值 IF @i BETWEEN 1 AND 26 BEGIN INSERT INTO [dbo].[T_Emp] ([EmpID],[EMpNo],[IsActive],[IsScience]) VALUES(@i,@i,1,1); END ELSE BEGIN INSERT INTO [dbo].[T_Emp] ([EmpID],[EMpNo],[IsActive],[IsScience]) VALUES(@i,@i,1,0); END END END
更高效的批量插入方案(推荐)
在SQL Server中,循环插入的效率远低于集合式操作,推荐使用CTE生成序列后批量插入:
WITH EmpSeq AS ( SELECT TOP 565 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS EmpID FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2 ) INSERT INTO [dbo].[T_Emp] ([EmpID],[EMpNo],[IsActive],[IsScience]) SELECT EmpID, EmpID, 1, CASE WHEN EmpID BETWEEN 1 AND 26 THEN 1 ELSE 0 END FROM EmpSeq;
内容的提问来源于stack exchange,提问作者Calm Boy
相关产品推荐
相关产品推荐

