преобразовать в UDF из оператора select - PullRequest
0 голосов
/ 07 мая 2010

Как можно преобразовать это в скалярный 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 ]

2 голосов
/ 07 мая 2010

Я настоятельно рекомендую вам не использовать скалярные 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 голос
/ 07 мая 2010

Вот как вы должны создать 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

Как ответил Мартин, создайте его как табличную функцию для возврата нескольких значений.

1 голос
/ 07 мая 2010

Редактировать Не удаляется, если вы решите пойти по этому пути ...

   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
    )
...