2010-01-13 104 views
1

我有一個存儲過程需要一個product_id並返回有關產品的一些數據。我想做一個查詢或過程,將這個存儲過程映射到「select * from products」查詢。有沒有辦法做到這一點?Sql服務器 - 「地圖」功能?

回答

2

這聽起來像你需要一個用戶定義的功能,而不是一個存儲過程。用戶定義的函數可以作爲查詢的一部分進行評估(例如,SELECT id,myFunc(id)AS'Product Info'FROM Products)。

CREATE FUNCTION在SQL Server BOL

順便說一句,存儲的特效被允許是非確定性的,而UDF是不是。如果您當前的存儲過程是非確定性的,那麼您需要重構/重新設計才能創建可包含在查詢中的UDF。

0

您的存儲過程將product_id作爲參數,並返回單個產品的信息。你想要做的是在查詢中使用該存儲過程,以便獲得一組結果,是否正確?

要做到這一點,你必須要麼使用一個視圖(如果它足夠簡單,這樣做),或更可能改寫存儲過程作爲一個用戶定義的函數。如果你有一個名爲GetInfoByProductId(@product_id)UDF返回單一產品一堆信息,那麼你可以寫,

select product_id, dbo.GetInfoByProductId(product_id) from products where ... 
0

我想你可以定義一個內嵌表值函數,並在使用它笛卡爾產品風格JOIN針對您的products表。這種連接會模仿你所說的「地圖」行爲。

SELECT d.* 
FROM products p JOIN getProductData(p.product_id) d 

請參閱Inline User-Defined Functions

+1

JOIN不允許您引用'p',您必須使用APPLY。 – 2010-01-13 21:34:24

+0

謝謝@Remus,我不是一個普通的微軟開發人員。 – 2010-01-13 21:35:42

0

另一種方法可以創建,簡化了存儲過程(S)和可以重複使用跨兩個不同的程序集的視圖。

您的觀點將負責完成所有聯接並將主要和支持列彙總在一起。

您可以有一個存儲過程,它接收product_id並返回該產品的記錄集。這個過程會像select * from [viewname]那樣product_id = @product_id。

其他程序將返回所有。這個過程看起來像select * from [viewname]。