[英]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.