2010-05-06 45 views
0

如何将其转换为标量UDF?我会将product_id传递给UDF。从select语句转换为UDF

运行SQL 2K5

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

回答

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 
    ) 
+0

像这样的内联TVF通常会比标量UDF执行得更好,因为优化器的表现更好。典型用法如下:SELECT t。*,products.qty FROM t OUTER APPLY [dbo]。[products](t.product_id)AS产品 – 2010-05-07 00:20:43

+0

此外 - 如果可能的话,拒绝创建多语句TVF的诱惑 - 这些无法像内联TVF一样进行优化。 – 2010-05-07 00:21:46

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所说,创建它作为表值函数返回多个值。

+0

他没有指定标量UDF - 我们需要澄清! – 2010-05-06 23:13:00

+0

标量,对多数民众赞成什么我需要 – jeff 2010-05-06 23:19:07

+0

寻找单一的价值将被退回 – jeff 2010-05-06 23:21:55

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的任何进程的执行计划。