Sql服务器 - “地图”功能?

问题描述:

我有一个存储过程需要一个product_id并返回有关产品的一些数据。我想做一个查询或过程,将这个存储过程映射到“select * from products”查询。有没有办法做到这一点?Sql服务器 - “地图”功能?

这听起来像你需要一个用户定义的功能,而不是一个存储过程。用户定义的函数可以作为查询的一部分进行评估(例如,SELECT id,myFunc(id)AS'Product Info'FROM Products)。

CREATE FUNCTION在SQL Server BOL

顺便说一句,存储的特效被允许是非确定性的,而UDF是不是。如果您当前的存储过程是非确定性的,那么您需要重构/重新设计才能创建可包含在查询中的UDF。

您的存储过程将product_id作为参数,并返回单个产品的信息。你想要做的是在查询中使用该存储过程,以便获得一组结果,是否正确?

要做到这一点,你必须要么使用一个视图(如果它足够简单,这样做),或更可能改写存储过程作为一个用户定义的函数。如果你有一个名为GetInfoByProductId(@product_id)UDF返回单一产品一堆信息,那么你可以写,

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

我想你可以定义一个内嵌表值函数,并在使用它笛卡尔产品风格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

另一种方法可以创建,简化了存储过程(S)和可以重复使用跨两个不同的程序集的视图。

您的观点将负责完成所有联接并将主要和支持列汇总在一起。

您可以有一个存储过程,它接收product_id并返回该产品的记录集。这个过程会像select * from [viewname]那样product_id = @product_id。

其他程序将返回所有。这个过程看起来像select * from [viewname]。