从select语句转换为UDF

时间:2010-05-06 22:54:55

标签: sql sql-server sql-server-2005 user-defined-functions

如何将其转换为标量UDF?我将product_id传递给UDF。

运行SQL 2k5

 SELECT 
 sum(qty) as qty,
  product_id
  FROM  vProductQuantity
 WHERE 
 product_id = @product_id
 GROUP BY product_id

3 个答案:

答案 0 :(得分:2)

我强烈建议您不要使用标量UDF进行任何重要处理。对于单个呼叫,它并不坏,但是为任何大量行调用它通常表现得非常糟糕。

如果你在其他行集中为多个产品调用它,则UDF将无法很好地扩展。

视图或内联表值函数的表现会更好:  即。

CREATE VIEW vQuantity AS
SELECT 
 sum(qty) as qty,
  product_id
  FROM  vProductQuantity
 GROUP BY product_id

SELECT *
FROM t
LEFT JOIN vQuantity ON vQuantity.product_id = t.product_id

CREATE FUNCTION udfQuantity(any params) RETURNS TABLE AS
RETURN (
    SELECT 
     sum(qty) as qty,
      product_id
      FROM  vProductQuantity
     GROUP BY product_id
)

SELECT *
FROM t
LEFT JOIN udfQuantity(any params) AS Quantity ON Quantity.product_id = t.product_id

我强烈建议您查看使用标量UDF的任何进程的执行计划。

答案 1 :(得分:1)

修改如果您决定采用此路线,则取消删除...

   CREATE FUNCTION [dbo].[products]
        (
        @product_id int
        )
    RETURNS TABLE
    AS RETURN
        (
    SELECT 
     sum(qty) as qty,
      product_id
      FROM  vProductQuantity
     WHERE 
     product_id = @product_id
    )

答案 2 :(得分:1)

以下是如何创建UDF以便它返回产品数量的整数值。

CREATE FUNCTION getProductQuantity (
   @product_id int
   )   
RETURNS int  
AS  
BEGIN  
  DECLARE @Return int
  SELECT   @Return = sum(qty) as qty   FROM  vProductQuantity  WHERE   product_id = @product_id  GROUP BY product_id

  RETURN @return  
END

正如Martin回答的那样,将其创建为表值函数以返回多个值。