【问题标题】:While Loop does not complete its execution in the stored procedure in SQL ServerWhile Loop 未在 SQL Server 的存储过程中完成其执行
【发布时间】:2018-11-29 03:16:21
【问题描述】:

我正在编写一个存储过程,它接受两个输入,例如 startingNumber=A00001 和 EndingNumber=A00049,它应该生成如下数字并插入到表中:

A00001
A00002
A00003
A00004
.
.
.
A00049

但是存储过程没有按预期工作,它继续执行并且没有完成。谁能帮我弄清楚哪里出了问题以及如何解决它。这是做这些事情的适当方法吗?如果有人能给我一些其他替代解决方案,我会更高兴。 这是我编写的存储过程:

CREATE PROCEDURE [dbo].[spInsertNumbers]
@StartingNumber nvarchar(25),
@EndingNumber nvarchar(25)
AS
Declare @StartIndex int 
Declare @EndIndex int 
Declare @Series varchar(5) 
Declare @StartNumber int 
Declare @EndNumber int
Declare @No nvarchar(25)
Declare @StartCounter int
Declare @EndCounter int
Declare @Number varchar(15)

--Getting the letter
set @Series = substring(@StartingNumber, 1, 1)

--Getting the starting index of the starting and ending Number
set @StartIndex = patindex('%[1-9]%', @StartingNumber)
set @EndIndex = patindex('%[1-9]%', @EndingNumber)

--Getting the starting and ending number
set @StartNumber = substring(@StartingNumber, @StartIndex, 6)
set @EndNumber = substring(@EndingNumber, @EndIndex, 6)

--Converting number string to integer
set @StartCounter = Convert(int, @StartNumber)
set @EndCounter = Convert(int, @EndNumber)

while (@StartCounter <= @EndCounter)

   set @Number = CONVERT(varchar, @StartCounter)

   if @StartCounter >= 1 and @StartCounter < 10
      set @No = @Series + '0000' + @Number

   if @StartCounter >= 10 and @StartCounter < 100
      set @No= @Series + '000' + @Number

   if @StartCounter >= 100 and @StartCounter < 1000
      set @No= @Series + '00' + @Number

   if @StartCounter >= 1000 and @StartCounter < 10000
      set @No= @Series + '0' + @Number

   if @StartCounter >= 10000 and @StartCounter < 100000
      set @No= @Series + @Number

BEGIN
   Insert into TestingNumber(Number)
   Values(@No);

   set @StartCounter = @StartCounter + 1
END

【问题讨论】:

标签: sql sql-server tsql while-loop


【解决方案1】:

你应该在while之后写BEGIN。否则,它会在您的过程中产生无限循环。

CREATE PROCEDURE [dbo].[spInsertNumbers] 
@StartingNumber nvarchar(25),
@EndingNumber nvarchar(25)
AS
Declare @StartIndex int 
Declare @EndIndex int 
Declare @Series varchar(5) 
Declare @StartNumber int 
Declare @EndNumber int
Declare @No nvarchar(25)
Declare @StartCounter int
Declare @EndCounter int
Declare @Number varchar(15)

--Getting the letter
set @Series = substring(@StartingNumber, 1, 1)

--Getting the starting index of the starting and ending Number
set @StartIndex = patindex('%[1-9]%', @StartingNumber)
set @EndIndex = patindex('%[1-9]%', @EndingNumber)

--Getting the starting and ending number
set @StartNumber = substring(@StartingNumber, @StartIndex, 6)
set @EndNumber = substring(@EndingNumber, @EndIndex, 6)

--Converting number string to integer
set @StartCounter = Convert(int, @StartNumber)
set @EndCounter = Convert(int, @EndNumber)

while (@StartCounter <= @EndCounter)
BEGIN
   set @Number = CONVERT(varchar, @StartCounter)

   if @StartCounter >= 1 and @StartCounter < 10
      set @No = @Series + '0000' + @Number

   if @StartCounter >= 10 and @StartCounter < 100
      set @No= @Series + '000' + @Number

   if @StartCounter >= 100 and @StartCounter < 1000
      set @No= @Series + '00' + @Number

   if @StartCounter >= 1000 and @StartCounter < 10000
      set @No= @Series + '0' + @Number

   if @StartCounter >= 10000 and @StartCounter < 100000
      set @No= @Series + @Number


   Insert into TestingNumber(Number)
   Values(@No);

   set @StartCounter = @StartCounter + 1
END

【讨论】:

  • 非常感谢它有效。我认为 @StartCounter 到 varchar 的转换会在递增时创建无限循环。这是解决此类问题的好方法吗,因为我觉得它的程序很长,因此可能会影响程序的性能。如果有任何简单的解决方案,你能分享一下吗?
  • 不客气!您可以使用这一行 SET @No = @Series + RIGHT('00000' + CONVERT(VARCHAR(5), @StartCounter), 5) 更改所有 @No 设置行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多