使用SQL Server 2005,我想运行存储过程并将所有结果插入到新表中。
我希望新表根据存储过程返回的数据自动配置其列。
我熟悉使用SELECT ... INTO
语法:
SELECT * INTO newtable FROM oldtable
这可能吗?
编辑澄清:我希望完成类似的事情:
Select * INTO newtable FROM exec My_SP
答案 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;