【发布时间】:2018-02-26 23:32:36
【问题描述】:
我有一个全局变量,它在嵌套的 While 循环中增加。在每次迭代中,它会将值重置为 1(即初始初始化值)。
示例可重现代码:
SET NOCOUNT ON;
DECLARE @GlobalCounter INT = 1;
DECLARE @CounterOne INT = 1;
DECLARE @CounterTwo INT = 1;
WHILE(@CounterOne <= 10)
BEGIN
PRINT 'Outer Loop:';
PRINT @GlobalCounter;
DECLARE @SerialInfo table
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[SNumber] [NVARCHAR](20) NOT NULL,
PRIMARY KEY ([Id])
);
SET @CounterTwo = 1;
WHILE(@CounterTwo <= 10)
BEGIN
DECLARE @SerialNumber NVARCHAR(20);
SET @SerialNumber = 'SRL: ' + CONVERT(NVARCHAR(10), @GlobalCounter);
INSERT INTO @SerialInfo([SNumber]) VALUES (@SerialNumber);
SET @GlobalCounter = @GlobalCounter + 1;
SET @CounterTwo = @CounterTwo + 1;
END
SET @CounterTwo = 1;
WHILE(@CounterTwo <= 10)
BEGIN
SET @SerialNumber = '';
SELECT @SerialNumber = [SNumber] FROM @SerialInfo WHERE [Id] = @CounterTwo;
PRINT @SerialNumber;
SET @CounterTwo = @CounterTwo + 1;
END
SET @CounterOne = @CounterOne + 1;
END
请在全局变量范围及其价值方面帮助我。如何达到预期效果
SRL: 1
SRL: 2
SRL: 3
.
.
.
SRL: 99
SRL: 100
【问题讨论】:
-
你目前得到了什么结果?
-
当我查看@serialinfo 中的结果时不确定问题出在哪里,我得到了您发布的预期结果。我们需要知道你得到了什么结果。
-
@Jonathan 我添加了一个屏幕截图,其中包含上述 SQL 查询的结果。
-
问题不在于全局计数器——而是表变量的声明。如果您在循环之后执行
select * from @SerialInfo,您应该会看到问题。如果您可以描述总体目标,我认为这是提议的解决方案的部分,那么可能有更好的方法可以在没有循环或表变量的情况下完成整个工作。
标签: sql sql-server while-loop scope sql-server-2016