跨服务器返回存储过程临时表数据

本文介绍了一种使用OpenQuery和OPENROWSET进行远程SQL查询的方法,包括设置步骤和注意事项,如如何避免只返回列信息的问题。
 解决这个问题,推荐使用OpenQuery或OPENROWSET的方法.  
  首先要说的是,这是一种非常规的方法,有一些性能上的缺陷.  
  OpenQuery,OPENROWSET允许用户在链接服务器上查询.通过这种方法来得到查询的结果集.  
  1.在创建存储过程中,必须设置  
        SET   ANSI_NULLS   ON  
        SET   ANSI_WARNINGS   ON  
        (在查询分析器中执行,将默认激活这些设置)  
  2.定义链接服务器(必须有sysadmin权限)  
      exec   sp_addlinkedserver   @server   =   'LOCALSERVER',     @srvproduct   =   '',  
                                                    @provider   =   'SQLOLEDB',   @datasrc   =   @@servername  
      @server是自定义链接服务器的名称  
      (如果不指定,将默认为master)  
  3.这个时候就可以使用  
  eg:SELECT   *   FROM   OPENQUERY(LOCALSERVER,   'EXEC   MyStoreProc')    
  来得到存储过程返回的结果集.   
        如果使用了临时表,必须如下调用  
        SELECT   *   FROM   OPENQUERY(LOCALSERVER,'SET   FMTONLY   OFF   EXEC   pubs..sp_fkeys   authors')  
      通常来说,OPENQUERY只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset.  
  而加上set   fmtonly   off用来屏蔽默认的只返回列信息的设置之后  
  select   *   from   openrowset(sqloledb,server;sa;,set   fmtonly   off    
  exec   ...)    
  ,这样返回的output集合就会提交给前面的select显示。  
  如果采用默认设置,会返回空集合导致select出错,命令也就无法执行了  
题目型问题,按照规定步骤回答如下: ### 题目重述 在 SQL Server 中,如何将存储过程查询返回的结果集插入到临时表中。 --- ### 详解 在 SQL Server 中,**不能直接使用 `INSERT INTO #TempTable EXEC StoredProc` 的方式插入存储过程结果**(除非满足特定条件),但可以通过以下方法实现。 #### ✅ 方法一:使用 `INSERT INTO ... EXEC`(推荐,适用于已知结构) 前提:临时表结构必须与存储过程返回的结果集列完全匹配。 ```sql -- 创建结构匹配的临时表 CREATE TABLE #TempResult ( ID INT, Name NVARCHAR(50), Value DECIMAL(10,2) ); -- 执行存储过程并将结果插入临时表 INSERT INTO #TempResult EXEC YourStoredProcedureName @Param1 = 'value1', @Param2 = 100; ``` > 注意: > - 列名不需要一致,但**数据类型、顺序、数量必须匹配** > - 存储过程中不能有动态 SQL 或多个结果集干扰 #### ✅ 方法二:使用 `OPENQUERY` 或 `OPENROWSET`(启用即席分布式查询) 如果 `INSERT EXEC` 嵌套受限(如已用过一次),可借助 `OPENROWSET` 模拟远程查询方式。 首先启用即席访问(仅首次): ```sql EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; ``` 然后执行: ```sql SELECT * INTO #TempFromOpenRowset FROM OPENROWSET('SQLNCLI', 'Server=YourServer;Trusted_Connection=yes;', 'EXEC YourDatabase.dbo.YourStoredProcedure') ``` > 替换实际服务器名、数据库名和连接字符串。 #### ⚠️ 方法三:修改存储过程返回结构 + 变量或全局临时表 若上述方法受阻,可在存储过程中直接写入**全局临时表**(`##GlobalTemp`)或由调用方创建中间。 示例: ```sql -- 在存储过程中创建并填充全局临时表 CREATE PROC YourStoredProcedure AS BEGIN SELECT A, B, C INTO ##GlobalTempResult -- 全局临时表 FROM SomeTable; END ``` 外部直接查询: ```sql EXEC YourStoredProcedure; SELECT * FROM ##GlobalTempResult; -- 可跨会话访问(注意并发) DROP TABLE ##GlobalTempResult; ``` > 不推荐用于多用户环境,易冲突。 #### ❌ 禁止嵌套 `INSERT EXEC` SQL Server 不允许嵌套使用 `INSERT EXEC`,例如: ```sql INSERT INTO #T1 EXEC proc_A -- 如果 proc_A 内部也有 INSERT EXEC,则报错 ``` --- ### 知识点 - **INSERT INTO EXEC**:将存储过程结果插入临时表,要求列结构严格匹配。 - **OPENROWSET**:通过分布式查询访问存储过程结果,需开启即席访问。 - **临时表作用域**:`#` 为本地,`##` 为全局,影响可见性和生命周期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值