sql循环查询赋值有关问题 第二次循环不起作用了

sql循环查询赋值问题 第二次循环不起作用了

declare @n int,@i int,@c varchar(100),@ca varchar(100)
set @n = 1
set @ca=''

select @i=count(*) from tbDemo 
while @n<@i
begin
       select top 1 @c = code from tbDemo where code not in (@ca) order by id
       if @ca = ''
       begin       
set @ca = @c    
   end
   else
set @ca = @ca + ',' + @c
       
       set @n=@n+1
       print @c
end

输出为
0001
0002
0001 错误了
0001
...
------解决方案--------------------
因为你not in 一个字符串,这个要用动态SQL,我改了一下你的查询,你看是不是要这个结果
CREATE TABLE  tbDemo (id int,code VARCHAR(4))
INSERT INTO tbDemo
SELECT 1 id ,'0001' code
UNION ALL 
SELECT 2,'0002'
UNION ALL 
SELECT 3,'0003'
UNION ALL 
SELECT 4,'0004'
UNION ALL 
SELECT 5,'0005'

SELECT DISTINCT stuff((select ','+code from tbDemo b 
       for xml path('')),1,1,'') 'code'
from tbDemo 
/*
code
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0001,0002,0003,0004,0005

*/

------解决方案--------------------
你[i]print @ca  就能明白为什么出现你现在的结果了吧
/*
0001
0001,0002
0001,0002,0001
*/

0001,0002这个值在你的表中不存在,所以还是会输出第一行的数据
------解决方案--------------------
@ca值为: 0001,0002  这是一个值 而不是你所理解的0001和0002两个值
表中没有这个值0001,0002   所以会查出来


declare @c nvarchar(max)
set @c='0001,0002'
select  code from tbDemo where code not in (@c) order by id
print @c


select  code from tbDemo where code not in (0001,0002) order by id

执行这两个查询 可以判断出来
------解决方案--------------------
declare @i int = 1
declare @c nvarchar(max),@code nvarchar(100)
declare @sql nvarchar(1000)
set @c=''
while @i <=5
begin
if @c=''
       begin       
        select top 1  @code= code from tbDemo where code not in (@c) order by id
set @c=@code
       end
else
begin
 set @sql = N'
select top 1 @code = code from tbDemo where code not in ('+@c+') order by id'
exec sp_executesql @sql,N'@code nvarchar(100) output',  @code = @code output
SET  @c = @c+','+@code
end
set @i = @i + 1
--print @c
PRINT @code
end
------解决方案--------------------
反了,不好意思
select top 1 @c = code from tbDemo where code CHARINDEX(','+ltrim(code)+',',','+@ca+',') > 0 order by id

------解决方案--------------------
说白了 就是not in 后面只有一个值 而不是一个集合 所以0001 被0002覆盖后 就没有0001了 就出现输出的第二个0001了
------解决方案--------------------
 while @i <= n  n这个值 其实是 select @n=count(1) from 表,跟你表数据量一样