我有这个the代码在一个过程中,我只是张贴相关的部分,为了简洁。
声明@tIDs表(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,尽管我已经声明了它。这是一个范围问题吗?它不会消失的。
发布于 2014-04-24 17:13:42
试试这个..。
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发布于 2014-04-24 16:44:19
再看一遍,@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;发布于 2014-04-24 16:41:00
在我看来,似乎您正在尝试使用内存中的表"@tIDs“作为光标内REPORT_CUBE_ID列的接收方(”从PHCursor获取下一步到@tIDs")。REPORT_CUBE_ID值的收件人变量应定义为与REPORT_CUBE_ID相同的数据类型。
也不太确定下一行要做什么;但是看起来您想从同一个表@tIDs中获取REPORT_CUBE_ID值吗?
假设REPORT_CUBE_ID是一个整数,也将@tIDs定义为一个整数,然后当您“将next从PHCursor提取到@tIDs”时,@tIDs将包含当前游标行的REPORT_CUBE_ID值,然后您将不需要使用@iCurrID访问它。
更好的是,“从PHCursor中获取next到@iCurrID”,然后完全去掉@tIDs。
https://stackoverflow.com/questions/23274707
复制相似问题