如果通过SqlServer链接服务器执行Oracle库查询,并取回结果?
比如:
Execute ('Select * From tb1 Where ID=?',4) At OracleLink执行成功,并可以看到结果集,可是怎么取回结果放入临时表中在进行下一步的使用呢? 

解决方案 »

  1.   

    Create Table #Tmp
    {
    字段1
    字段2
    }
    创建临时表,临时表用完记得Drop掉也可以使用SQLServer中的Table数据类型来存放你取得的数据
      

  2.   

    drop table #Tmp   --删除临时表#Tmp
    create table #Tmp --创建临时表#Tmp
    (
        ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
        WokNo                varchar(50),   
        primary key (ID)      --定义ID为临时表#Tmp的主键      
    );
    Select * from #Tmp    --查询临时表的数据
    truncate table #Tmp --清空临时表的所有数据和约束相关例子:Declare @Wokno Varchar(500) --用来记录职工号
    Declare @Str NVarchar(4000) --用来存放查询语句
    Declare @Count int --求出总记录数      
    Declare @i int
    Set @i = 0 
    Select @Count = Count(Distinct(Wokno)) from #Tmp
    While @i < @Count 
        Begin
           Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
           Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
           Select @WokNo,@i --一行一行把职工号显示出来
           Set @i = @i + 1
        End
    临时表
    可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
    INSERT INTO #MyTempTable VALUES (1)如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
    所有其它本地临时表在当前会话结束时自动除去。
    全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。 
    在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:CREATE PROCEDURE Test2
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (2)
    SELECT Test2Col = x FROM #t
    GO
    CREATE PROCEDURE Test1
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (1)
    SELECT Test1Col = x FROM #t
    EXEC Test2
    GO
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (99)
    GO
    EXEC Test1
    GO下面是结果集:(1 row(s) affected)Test1Col    
    ----------- 
    1          (1 row(s) affected)Test2Col    
      

  3.   

    谢谢楼上的回复。
    如果是SQL Server本身的表或存储过程,可以通过
    Insert Into #Tmp Execute ('Select * From tb1')完成。
    但是换成了链接服务器,执行Oracle的查询,就不行了,因为不在一个事务内了。
      

  4.   

    回复楼上。
    数据从Oracle查询出来后,下一步就是将查询结果保存在SQL SERVER 本地表中。谢谢,不知道明白我的意思了吗。
      

  5.   

    insert #tb Execute ('Select * From tb1 Where ID=?',4) At OracleLink
      

  6.   


    不行,不在一个事务体内,报错。换成sql没有问题,但换成Oracle就不行了。谢谢回复。
      

  7.   


    把错误信息贴出来:新事务不能登记到指定的事务处理器中。链接服务器的访问接口'Oraoledb.oracle'无法启动分布式事务。
      

  8.   

    如果可以通过链接服务器执行Oracle的存储过程,并等到Oracle存储过程的输出参数也可以。我试过了,可以通过链接服务器成功执行Oracle的存储过程(有输入参数,没有输出参数),但是带了输出参数的存储过程就执行错误。不知道各位有什么经验和方法,谢谢了。
      

  9.   

    应该是可以的。因为之前我也弄过这样的,不过是从sql 中查询数据 再更新到oracle中的。
    不过我想这应该是同一个道理吧。
    但是只能一个表一个表的查询更新。(我的方法,希望各位有好的方法告诉我。谢谢)
    你可以弄两个数据 库联接,一个sqlserver的数据源连接,另一个oracle数据库的连接。
    先查询oracle中的数据库(可以使用sql类似的语句执行),
    同理,再把oracle数据库中查询到的数据再更新到sql server中的数据库中(sql插入方法),
    然后通过sql server中再把数据获得并读出来。