日期:2014-05-17  浏览次数:20469 次

[SqlServer]循环套用动态语句时,循环变量的控制出错!
由于需要把很多的数据表的查询放在一起,所以考虑使用定义动态语句时,套用while循环。
结果 用来控制循环的变量无法进行更新值。


declare @sql varchar(3000)

declare @date datetime
declare @m varchar(2)
declare @d varchar(2)

set @date=CONVERT(varchar(10),getdate(),120)
set @m=right('0'+cast(DATEPART(M,@date) as varchar),2)
set @d=right('0'+cast(DATEPART(D,@date) as varchar),2)

set @sql='create table #x(m varchar(7),d varchar(10),ref varchar(1000))'+'
while ('+@d+'=15)
begin
insert into #x(m,d,ref)
select top 10 CONVERT(varchar(7),visit_time,120),
CONVERT(varchar(10),visit_time,120),left(REFERRER,charindex('''+'/'+''',REFERRER,12))
from WebLog_2012_'+@m+'_'+@d+' 
where REFERRER like '''+'%.baidu.%'+'''
select count(*) from #x
set '+@d+'='+@d+'-1 /*这句没有办法更新*/
end
select * from #x'

exec (@sql)

------解决方案--------------------
你的这个变量 在这里面已经变成常量了

你可以只把 insert into #x(m,d,ref)
select top 10 CONVERT(varchar(7),visit_time,120),
CONVERT(varchar(10),visit_time,120),left(REFERRER,charindex('''+'/'+''',REFERRER,12))
from WebLog_2012_'+@m+'_'+@d+' 
where REFERRER like '''+'%.baidu.%'+'''

这一段放到动态里面