SQL - 如何在不指定新表的列的情况下将Stored_Proc的结果插入到新表中?

时间:2010-02-12 01:52:21

标签: sql sql-server-2005 stored-procedures

使用SQL Server 2005,我想运行存储过程并将所有结果插入到新表中。

我希望新表根据存储过程返回的数据自动配置其列。

我熟悉使用SELECT ... INTO语法:

SELECT * INTO newtable FROM oldtable

这可能吗?

编辑澄清:我希望完成类似的事情:

Select * INTO newtable FROM exec My_SP

3 个答案:

答案 0 :(得分:2)

执行此操作的唯一方法是针对本地服务器执行OPENROWSET:

SELECT * INTO #temp 
FROM OPENROWSET (
    'SQLOLEDB'
  , 'Server=(local);TRUSTED_CONNECTION=YES;'
  , 'SET FMTONLY OFF EXEC database.schema.procname'
  ) a

但是,这是一种最后沟壑,不管怎么说,该死的后果。它需要提升权限,不适用于所有程序,并且通常效率低下。

更多信息和一些替代方案:http://www.sommarskog.se/share_data.html

答案 1 :(得分:2)

这看起来像是一个可怕的设计。每次调用存储过程时,您是否真的要创建一个新表来存储存储过程的结果?你真的不能提前创建表,因为你完全不知道存储过程有什么样的输出?如果存储过程返回多个结果集怎么办?如果它有副作用怎么办?

好吧,好吧,如果这就是你真正想做的事情......

实现此目的的一种方法是将本地服务器用作链接服务器并使用OPENQUERY。首先,您需要确保配置本地服务器以进行数据访问:

EXEC sp_serveroption 'local server name', 'DATA ACCESS', true;

然后你可以这样做:

SELECT * INTO dbo.newtable
FROM OPENQUERY('local server name', 'EXEC yourdb.dbo.yourproc;');

PS你每次都要将编写要执行SELECT INTO的代码写入新的表名(因为你只能执行SELECT INTO一次)?动态SQL?如果两个用户同时运行此代码会发生什么?他们中的一个是赢了,另一个只是收到错误消息吗?

答案 2 :(得分:0)

相同的变体是

create table somename
  select * from wherever;