T-SQL错误可能是范围问题?

时间:2014-04-24 16:31:58

标签: tsql cursor

我在程序中有这个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我已经声明了它。这是范围问题吗?它不会消失。

3 个答案:

答案 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。