我在程序中有这个T-SQL代码,为了简洁,我只发布相关部分。
声明@tIDs TABLE(ID int)
While 1=1
begin
set @iCnt = @iCnt + 1
if @iCnt > @iNumberDuplication break
set @iLoop = 0
declare PHcursor cursor for (select REPORT_CUBE_ID from @tPULSE_HYPERCUBE)
open PHcursor
While 1=1
begin
set @iLoop = @iLoop + 1
if @iLoop > @iPHrows break
fetch next from PHcursor into @tIDs
set @iCurrID = (select ID from @tIDs)
set @iIDloop = @iIDloop + 1
set @iREPORT_CUBE_ID = 90000000000000 + @iIDloop
UPDATE @tPULSE_HYPERCUBE SET REPORT_CUBE_ID = @iREPORT_CUBE_ID WHERE REPORT_CUBE_ID = @iCurrID
UPDATE @tPULSE_METRIC_DETAILS SET REPORT_CUBE_ID = @iREPORT_CUBE_ID WHERE REPORT_CUBE_ID = @iCurrID
DELETE FROM @tIDs
end
CLOSE PHcursor
DEALLOCATE PHcursor
insert into X_PULSE_HYPERCUBE (REPORT_CUBE_ID, CM_PHY_OWNER_ID, CM_LOG_OWNER_ID,INTERVAL_C,INTERVAL_START_DATE,PULSE_METRIC_ID,USER_ID) (select * from @tPULSE_HYPERCUBE)
end
我收到一个错误,我必须声明标量变量@tIDs我已经声明了它。这是范围问题吗?它不会消失。
答案 0 :(得分:1)
再看一遍,@ HLGEM是正确的;这应该是几个简单的更新声明...
update m
set REPORT_CUBE_ID = REPORT_CUBE_ID + 90000000000000
from @tPULSE_HYPERCUBE h
inner join @tPULSE_METRIC_DETAILS m on h.REPORT_CUBE_ID = m.REPORT_CUBE_ID;
update @tPULSE_HYPERCUBE
set REPORT_CUBE_ID = REPORT_CUBE_ID + 90000000000000;
答案 1 :(得分:1)
试试这个......
declare @loop integer = 30000;
while @loop > 0 begin
insert into @tPULSE_HYPERCUBE (REPORT_CUBE_ID, col2, col3...)
select REPORT_CUBE_ID + 90000000000000 + @loop, col2, col3...
from @tPULSE_HYPERCUBE
where REPORT_CUBE_ID < 90000000000000;
set @loop = @loop - 1;
end
答案 2 :(得分:0)
让我觉得你好像在尝试使用内存表&#34; @tIDs&#34;作为游标中REPORT_CUBE_ID列的接收者(&#34;从PHCursor获取下一个到@tIDs&#34;)。应将REPORT_CUBE_ID值的收件人变量定义为与REPORT_CUBE_ID相同的数据类型。
不太确定你在下一行上做了什么;但看起来你试图从同一个表@tIDs中取回REPORT_CUBE_ID值?
假设REPORT_CUBE_ID是一个整数,也将@tIDs定义为一个整数,然后当你从PHCursor获取下一个到@tIDs&#34;时,@ tIDs将包含当前光标行的REPORT_CUBE_ID值和你然后不需要使用@iCurrID访问它。
更好的是,&#34;从PHCursor获取下一个@ iCurrID&#34;并完全摆脱@tIDs。