SQL 服务器中存储过程中的连续 While 循环

Consecutive While loops within a stored procedure in SQL Server

我正在创建一个包含两个 while 循环的存储过程,下面提到的用于创建几个临时 tables,下一个循环将一些数据写入它。

临时 table 名称是从静态 table

中检索的

问题:下面的 while 循环在第一次迭代后进入下一个循环(第二个循环)。我在这里做错了什么吗?

或者这就是 while 循环在 SQL 服务器 (Azure SQL MI) 中一个过程中的工作方式?

以这种方式创建临时 table 也是一个好习惯吗?

declare @b varchar(100)
declare @bmax varchar(100)
declare @inpt_tbl_nm varchar(100)
declare @inpt_tbl_sql varchar(1000)
set @b = 1

select @bmax = max(RwId) from eds_int.abc

while @b < = @bmax
begin
    select @inpt_tbl_nm = otpt_tmp_tbl from eds_int.abc where Rwid=@b
    select @inpt_tbl_sql = 'create table ' + @inpt_tbl_nm + '(RowId INT IDENTITY(1,1), SchemaName sysname, TableName nvarchar(150), query nVARCHAR(4000), condition  nVARCHAR(4000))'

    exec (@inpt_tbl_sql)
    set @b = @b + 1
end

DECLARE @a INT
DECLARE @amax INT
DECLARE @max INT

SELECT @a = 1, @amax = MAX(RwId) from eds_int.abc

WHILE @a <= @amax
BEGIN
.
.
.
.
END

编辑:

declare @b int
declare @bmax int
declare @inpt_tbl_nm varchar(100)
declare @inpt_tbl_sql varchar(1000)
declare @test_query varchar(1000)

set @b = 1
select @bmax = 1
while @b < = @bmax
begin
print @b
select @inpt_tbl_nm = '#test_delete'
select @inpt_tbl_sql = 'create table ' + @inpt_tbl_nm + '(RowId INT IDENTITY(1,1), SchemaName sysname, TableName nvarchar(150), query nVARCHAR(4000), condition  nVARCHAR(4000))'
exec (@inpt_tbl_sql)
print @inpt_tbl_sql
select @test_query = 'select * from ' + @inpt_tbl_nm
exec (@test_query)
set @b = @b + 1
end

错误:消息 208,级别 16,状态 0,第 1 行 对象名称“#test_delete”无效。

我关于 WHILE 的观点仍然来自评论;并且该过程也很可能存在缺陷。你所拥有的虽然没什么意义。

您有 2 个变量 @b@bmax,它们都是 varchar(100)s。我不知道 @bmax 的值设置为什么,但我们假设它是 '10' (不是 10 并且您设置了该值@b'1' (不是 1此外,您使用 varchar(100) 意味着您需要存储 "number" 到 (10*10^99)-1。这比所谓的 "Googol".

少 1

然后进入第一个循环,所以RDBMS检查是'1'小于'10'不是1小于10)。就这样输入了WHILE。并执行第一次迭代。

在该迭代结束时,您有 set @b = @b + 1,转换为以下内容(使用数据类型优先级):

@b + 1 = '1' + 1 = 1 + 1 = 2 ∴ @b = '2'

然后你的WHILE又开始了,检查'2'小于'10'小于2 10);这失败了,因为 '2' '10',因此您的 WHILE 已退出。

TL;DR:数据类型很重要。字符串不是数字,它们的行为也不像数字。