【问题标题】:Exec stored procedure into dynamic temp table将存储过程执行到动态临时表中
【发布时间】:2013-12-15 07:36:14
【问题描述】:

据我所知;我想做的事情在sql中是不可能的,但是值得请教各位。

假设我有一个返回列 Id 和 Value 的存储过程 abc。这个存储过程主要是其他部门出于功能原因使用的,我只会偶尔用它来做数据检查。

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

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

INSERT INTO @tABC
   EXEC OtherDb.DataProd.abc

好的,现在这将完美运行,但是如果他们更改存储过程的结构怎么办?

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

我最后一次绝望的尝试是这样的:

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

显然失败得很惨。

【问题讨论】:

  • 这就是为什么你应该使用表值函数或表变量而不是存储过程来返回表。无论如何,OPENROWSET 可能是您的解决方案
  • @adrianm 您对 UDF 的评论实际上解决了我的问题。我不敢相信我以前没有看到过。
  • 无论你的代码多么动态,如果他们删除你使用的列,你的代码就会被破坏。不要因为糟糕的变更控制而给您的流程增加不必要的开销。我做了很多动态代码,但从来没有因为变更控制不佳

标签: sql sql-server tsql stored-procedures


【解决方案1】:
SELECT * INTO #TempTable 
FROM OPENROWSET
('SQLNCLI','Server=(local)\SQL2008R2;Trusted_Connection=yes;',
     'EXEC OtherDb.DataProd.abc')

SELECT * FROM #TempTable

【讨论】:

  • 启用 OPENROWSET 不是安全风险吗?
  • 在一定程度上是的。但是没有其他方法可以满足您的要求,AFAIK
【解决方案2】:

插入临时表。我知道这适用于 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

【讨论】:

  • 问题是“好的,现在这将完美运行,但是如果他们更改存储过程的结构怎么办?”所以这不是一个好的解决方案。
  • 我同意以下评论:Adriaan Davel 2016 年 7 月 20 日 9:15 请参阅上面的评论。
【解决方案3】:

使用 openrowset 更好更简单的方法

SELECT * INTO #tempTable FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC OtherDb.DataProd.abc')

【讨论】:

  • 请添加一些描述来回答。
【解决方案4】:

否则看这里,那里解释了更多选项:Insert results of a stored procedure into a temporary table?

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多