2009-01-16 95 views
4

假設我有'myStoredProcedure',它將一個Id作爲參數,並返回一個信息表。MSSQL2000:使用存儲過程結果作爲sql中的表格

是否可以編寫類似於此的SQL語句?

SELECT 
    MyColumn 
FROM 
    Table-ify('myStoredProcedure ' + @MyId) AS [MyTable] 

我得到它不是的感覺,但它會在一個場景中我有遺留代碼&鏈接服務器表

感謝非常有益的!

回答

5

您可以用這種方式使用表值函數。

Here是一些技巧...

+0

我剛剛回答了有關TVF的問題。搜索SO應該舉一些例子。 +1。 – ConcernedOfTunbridgeWells 2009-01-16 19:43:01

1

不,它不是 - 至少不是在任何正式的或書面的方式 - 除非你改變你的存儲過程的TVF。

但是,有辦法(讀)黑客做到這一點。他們基本上涉及一個鏈接的服務器和使用OpenQuery - 例如見here。但請注意,由於您需要對服務器的名稱進行硬編碼,因此它非常脆弱 - 所以如果您有多個具有不同名稱的SQL Server實例,則可能會出現問題。

1

下面是在存儲過程http://www.sommarskog.se/share_data.html之間共享數據的方式的一個很好的總結。

基本上它取決於你想要做什麼。最常見的方法是在調用存儲過程並將其填充之前創建臨時表,或者使用一個永久表來存儲過程將數據轉儲到其中幷包含進程ID的永久表。

表格值函數已被提及,但是當您創建一個函數而不是存儲過程時會有一些限制,因此它們可能適合您,也可能不適合您。該鏈接提供了一個很好的指導。

SQL Server 2005和SQL Server 2008稍微改變了這些選項。 SQL Server 2005+使得使用XML更容易。所以XML可以作爲輸出變量傳遞,並且很容易使用XML函數節點和值「分解」到表中。我相信SQL 2008允許表變量傳遞到存儲過程(儘管只讀)。由於您引用了SQL 2000,2005+增強功能不適用於您,但我提到它們的完整性。

很可能你會使用表值函數,或者在調用存儲過程之前創建臨時表,然後讓它填充它。

1

在處理項目時,我使用下面的命令將xp_readerrorlog(afaik,返回一個表)的結果插入到提前創建的臨時表中。

INSERT INTO [tempdb].[dbo].[ErrorLogsTMP] 
EXEC master.dbo.xp_readerrorlog 

從臨時表中選擇所需的列。