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

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方法將排除使用返回多個結果集的存儲過程。在單個存儲過程中包裝多個內聯表值用戶定義函數可以實現此目的。
添加回答
舉報