2010-05-06 46 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的任何進程的執行計劃。