亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將存儲過程的結果插入臨時表

將存儲過程的結果插入臨時表

慕田峪4524236 2019-05-27 10:57:12
將存儲過程的結果插入臨時表我該怎么辦SELECT * INTO [temp table] FROM [stored procedure]?不FROM [Table],沒有定義[temp table]?Select所有數據都可以BusinessLine正常tmpBusLine工作。select *into tmpBusLinefrom BusinessLine我嘗試相同,但使用stored procedure返回數據,并不完全相同。select *into tmpBusLinefromexec getBusinessLineHistory '16 Mar 2009'輸出消息:消息156,級別15,狀態1,行2關鍵字'exec'附近的語法不正確。我已經閱讀了幾個創建一個與輸出存儲過程結構相同的臨時表的例子,它工作正常,但不提供任何列會很好。
查看完整描述

4 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

你可以使用OPENROWSET??匆豢?。我還包括sp_configure代碼以啟用Ad Hoc Distributed Queries,以防它尚未啟用。

CREATE PROC getBusinessLineHistory

AS

BEGIN

    SELECT * FROM sys.databases

END

GO


sp_configure 'Show Advanced Options', 1

GO

RECONFIGURE

GO

sp_configure 'Ad Hoc Distributed Queries', 1

GO

RECONFIGURE

GO


SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',

     'EXEC getBusinessLineHistory')


SELECT * FROM #MyTempTable


查看完整回答
反對 回復 2019-05-27
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

如果要在不先聲明臨時表的情況下執行此操作,可以嘗試創建用戶定義的函數而不是存儲過程,并使該用戶定義的函數返回表?;蛘?,如果您想使用存儲過程,請嘗試以下方法:

CREATE TABLE #tmpBus(
   COL1 INT,
   COL2 INT)INSERT INTO #tmpBusExec SpGetRecords 'Params'


查看完整回答
反對 回復 2019-05-27
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

這是對您的問題的略微修改版本的答案。如果您可以放棄對用戶定義函數使用存儲過程,則可以使用內聯表值用戶定義函數。這本質上是一個存儲過程(將采用參數),它返回一個表作為結果集; 因此將很好地與INTO聲明。

這是一篇關于它和其他用戶定義函數的快速文章。如果仍然需要存儲過程,則可以使用存儲過程包裝內聯表值用戶定義函數。當存儲過程從內聯表值用戶定義函數調用select *時,它只傳遞參數。

因此,例如,您將擁有一個內聯表值用戶定義函數來獲取特定區域的客戶列表:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)RETURNS TABLE ASRETURN 
  SELECT *
  FROM customers  WHERE RegionID = @RegionID
GO

然后,您可以調用此函數來獲得結果:

SELECT * FROM CustomersbyRegion(1)

或者做一個SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

如果您仍需要存儲過程,則將函數包裝為:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)ASBEGIN
     SELECT * FROM CustomersbyRegion(@regionID);ENDGO

我認為這是獲得預期結果的最“無懈怠”的方法。它使用現有的功能,因為它們的使用目的沒有額外的復雜性。通過在存儲過程中嵌套內聯表值的用戶定義函數,您可以通過兩種方式訪問該功能。加!實際的SQL代碼只有一個維護點。

已經建議使用OPENROWSET,但這不是OPENROWSET函數的用途(來自聯機叢書):

包括從OLE DB數據源訪問遠程數據所需的所有連接信息。此方法是訪問鏈接服務器中的表的替代方法,是使用OLE DB連接和訪問遠程數據的一次性臨時方法。要更頻繁地引用OLE DB數據源,請改用鏈接服務器。

使用OPENROWSET將完成工作,但是它會產生一些額外的開銷,用于打開本地連接和編組數據。它也可能不是所有情況下的選項,因為它需要臨時查詢許可,這會帶來安全風險,因此可能不是所希望的。此外,OPENROWSET方法將排除使用返回多個結果集的存儲過程。在單個存儲過程中包裝多個內聯表值用戶定義函數可以實現此目的。


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 2740 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號