4 回答

TA貢獻1934條經(jīng)驗 獲得超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

TA貢獻1827條經(jīng)驗 獲得超9個贊
這是對您的問題的略微修改版本的答案。如果您可以放棄對用戶定義函數(shù)使用存儲過程,則可以使用內(nèi)聯(lián)表值用戶定義函數(shù)。這本質(zhì)上是一個存儲過程(將采用參數(shù)),它返回一個表作為結(jié)果集; 因此將很好地與INTO聲明。
這是一篇關(guān)于它和其他用戶定義函數(shù)的快速文章。如果仍然需要存儲過程,則可以使用存儲過程包裝內(nèi)聯(lián)表值用戶定義函數(shù)。當(dāng)存儲過程從內(nèi)聯(lián)表值用戶定義函數(shù)調(diào)用select *時,它只傳遞參數(shù)。
因此,例如,您將擁有一個內(nèi)聯(lián)表值用戶定義函數(shù)來獲取特定區(qū)域的客戶列表:
CREATE FUNCTION CustomersByRegion ( @RegionID int )RETURNS TABLE ASRETURN SELECT * FROM customers WHERE RegionID = @RegionID GO
然后,您可以調(diào)用此函數(shù)來獲得結(jié)果:
SELECT * FROM CustomersbyRegion(1)
或者做一個SELECT INTO:
SELECT * INTO CustList FROM CustomersbyRegion(1)
如果您仍需要存儲過程,則將函數(shù)包裝為:
CREATE PROCEDURE uspCustomersByRegion ( @regionID int )ASBEGIN SELECT * FROM CustomersbyRegion(@regionID);ENDGO
我認(rèn)為這是獲得預(yù)期結(jié)果的最“無懈怠”的方法。它使用現(xiàn)有的功能,因為它們的使用目的沒有額外的復(fù)雜性。通過在存儲過程中嵌套內(nèi)聯(lián)表值的用戶定義函數(shù),您可以通過兩種方式訪問該功能。加!實際的SQL代碼只有一個維護點。
已經(jīng)建議使用OPENROWSET,但這不是OPENROWSET函數(shù)的用途(來自聯(lián)機叢書):
包括從OLE DB數(shù)據(jù)源訪問遠程數(shù)據(jù)所需的所有連接信息。此方法是訪問鏈接服務(wù)器中的表的替代方法,是使用OLE DB連接和訪問遠程數(shù)據(jù)的一次性臨時方法。要更頻繁地引用OLE DB數(shù)據(jù)源,請改用鏈接服務(wù)器。
使用OPENROWSET將完成工作,但是它會產(chǎn)生一些額外的開銷,用于打開本地連接和編組數(shù)據(jù)。它也可能不是所有情況下的選項,因為它需要臨時查詢許可,這會帶來安全風(fēng)險,因此可能不是所希望的。此外,OPENROWSET方法將排除使用返回多個結(jié)果集的存儲過程。在單個存儲過程中包裝多個內(nèi)聯(lián)表值用戶定義函數(shù)可以實現(xiàn)此目的。
添加回答
舉報