2013-11-29 28 views
14

据我所知,我想要做的是不可能在SQL中,但它值得问你们。执行存储过程到动态临时表

可以说我有一个存储过程abc,它返回列Id和值。这个存储过程主要由其他部门使用,出于功能方面的原因,我只会每隔一段时间使用它来进行数据检查。

所以用它作为我的存储过程的一部分:

DECLARE @tABC TABLE 
(
    ID  INT, 
    Value DECIMAL(12,2) 
) 

INSERT INTO @tABC 
    EXEC OtherDb.DataProd.abc 

OKY所以这将很好地工作现在,但是如果他们改变自己的存储过程的结构是什么?

从他们的存储过程添加或删除一列会破坏我的代码,所以有办法让我的代码更加灵活。

我最后的孤注一掷去是这样的:

WITH tempTable AS 
(
    EXEC OtherDb.DataProd.abc 
) 
SELECT ID, Value FROM tempTable 

这显然遭到惨败。

+3

这就是为什么你应该使用表值函数或表变量而不是存储过程来返回表。无论如何,OPENROWSET可能是您的解决方案 – adrianm

+0

@adrianm您对UDF的评论实际上解决了我的问题。我不相信我以前没有看到过。 – JAT

+0

[将存储过程的结果插入临时表中]的可能重复(http://stackoverflow.com/questions/653714/insert-results-of-a-stored-procedure-into-a-temporary-table) –

回答

8
SELECT * INTO #TempTable 
FROM OPENROWSET 
('SQLNCLI','Server=(local)\SQL2008R2;Trusted_Connection=yes;', 
    'EXEC OtherDb.DataProd.abc') 

SELECT * FROM #TempTable 
+0

启用OPENROWSET不是安全风险吗? – JAT

+0

在某种程度上,是的。但是没有其他方法可以满足您的需求,AFAIK – Raj

6

插入临时表。我知道这在2008年及以上的作品,不知道2005年左右。你的临时表列必须匹配你的存储过程列。

create table #mytable (custid int,company varchar(50),contactname varchar(50) 
       , phone varchar(50),address1 varchar(50) 
       , address2 varchar(50),city varchar(50) 
       ,st varchar(2),zip varchar(20)) 

insert into #mytable (custid,company,contactname,phone,address1,address2,city,st,zip) 
exec dbo.sp_Node_CustomerList_wService @segid = 1 

select * from #mytable 
where custid = 5 

drop table #mytable 
+0

问题是“Oky,所以现在可以完美地工作,但如果他们改变了存储过程的结构呢?”所以这不是一个好的解决方案。 – CLS

+0

我同意评论人: Adriaan Davel 7年7月20日于9:15 请参阅上面的评论。 –

0

最好是简便的方法来使用OPENROWSET

SELECT * INTO #tempTable FROM OPENROWSET( 'SQLNCLI', '服务器=本地主机; Trusted_Connection =是;', “EXEC OtherDb.DataProd。 abc')

+0

请添加一些描述来回答。 –