簡體   English   中英

我無法使用函數從表中發送數值

[英]I can't send numerical values from a table using a function

Alter function calcular(@cajas int, @peso int)
RETURNS int
AS
BEGIN
  set @cajas = (select cant_entr from entrega)
  set @peso = (select peso_entr from entrega)

  DECLARE @mercaderia int;
  SELECT @mercaderia = @cajas * @peso * 0.5

  RETURN @mercaderia;
END
go 

SELECT 
    dbo.calcular(cant_entr, peso_entr), matr_veh 
FROM
    entrega, vehiculo 
WHERE 
    matr_veh = 'PTK-0165'

它應該從所有行中返回一個以上的值,但是我希望在所有匹配值都具有汽車板= PTK-0165的情況下添加所有這些行。

我要問的是:創建一個函數來計算“路線表”中所運輸商品的價值(箱數*重量* 0.5),其中卡車板='PTK-0165'

我將刪除標量函數,並將計算結果放入您的查詢中。 標量函數只會毫無理由地使查詢變慢。 當然,按照功能編碼,這是一場災難。

不知道您是否真的想要交叉連接,還是應該是內部/外部連接,但是此代碼應該與您想要的內容接近,而不會帶來函數的所有額外麻煩。

SELECT e.cant_entr * e.peso_entr * .5 as calcular
    , matr_veh 
from entrega e
cross join vehiculo v
where v.matr_veh='PTK-0165'

- 編輯 -

由於您的教授要求使用函數,並且沒有提及類型,因此您應該使用內聯表值函數。 這更易於使用,並具有不破壞查詢性能的附加好處。 遵循這些原則。

create function calcular
(
    @cajas int
    , @peso int
) returns table as
    RETURN
    select @cajas * @peso * .5 as mercarderia

go

SELECT c.mercarderia
    , matr_veh 
from entrega e
cross join vehiculo v
cross apply calcular(e.cant_entr, e.peso_entr) c
where v.matr_veh='PTK-0165'

-最終編輯-

由於您的老師希望您看到性能差異,因此應將其設為標量函數。 這是您要執行的操作。

Alter function calcular(@cajas int, @peso int)
RETURNS decimal(7, 2)
AS
BEGIN
  DECLARE @mercaderia decimal(7, 2);
  SELECT @mercaderia = @cajas * @peso * 0.5
  RETURN @mercaderia;
END
go 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM