sp_executesql和临时表的用法

        相比oracle,sqlserver对数据集的操作不直观,而且比较麻烦。我就遇到这样的一种情形,想获取 exec sp_executesql @sql返回的数据集,然后对返回的数据集进行遍历。
        起初,我利用游标来操作返回的数据集,但是游标不支持 exec sp_executesql @sql 返回的数据集,于是我想到了临时表,但很快发现,利用 exec sp_executesql 操作创建的临时表,其作用范围只存在于当前语句中,它后面的语句就不能再引用这个临时表了。
        也许有人会说,先把临时表定义好,不就可以了。其实,我要做的这个工作,临时表的列是变化的,所以不能先定义临时表。这是我想到了全局临时表,把查询的数据集存入全局临时表中。
        下面给出sqlserver和oracle进行此类操作的代码,希望能对大家有所帮助。
ContractedBlock.gif ExpandedBlockStart.gif Code
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..##temptb'and type='U')
  
drop table ##temptb

set @v_SelectSubTab = 'select * into ##temptb from ' + @v_TableName + ' where ID=''' + cast(@v_Id as nvarchar(10)) + ''''
exec sp_executesql  @v_SelectSubTab
-- 或者
set @v_SelectSubTab = 'select * from ' + @v_TableName + ' where ID=''' + cast(@v_Id as nvarchar(10)) + ''''
insert into ##temptb exec sp_executesql  @v_SelectSubTab

oracle代码操作如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
         cursor_Select integer;
         v_Result 
integer;

         cursor_Select :
= Dbms_Sql.open_cursor;
         v_SelectSubTab :
= 'Select ID From '||v_TableName||' Where ID = :ID';
         Dbms_Sql.parse(cursor_Select,v_SelectSubTab,Dbms_Sql.native);
         Dbms_Sql.define_column(cursor_Select,
1,id);
         Dbms_Sql.bind_variable(cursor_Select,
':ID',v_OldId);
         v_Result :
= Dbms_Sql.execute(cursor_Select);
         
while(Dbms_Sql.fetch_rows(cursor_Select_Sub_Tab) > 0)
             loop
                  
             
end loop;
        Dbms_Sql.close_cursor(cursor_Select);

如果大家更好的,解决该问题的方法,即时讨论。

转载于:https://www.cnblogs.com/mjgforever/archive/2009/08/19/1549508.html

你可能感兴趣的:(sp_executesql和临时表的用法)