2015-07-02 55 views
1
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我不能使用功能發送從表中的數值

這是我被要求:創建一個從「路線片」,其中卡車平板=「PTK-0165」

+0

抱歉,無法理解你想要什麼,不知道爲什麼你正在重置參數[儲蓄銀行]與[比索(隨機?)從[entrega表 – jean

+2

值您有這這麼多問題代碼很難知道從哪裏開始。首先是在函數中設置變量,無論您傳入的參數如何,它們將始終具有相同的值,因爲您的查詢沒有where子句。你不應該爲此使用標量函數,它只會減慢一切。最後但並非最不重要的一點是,在from子句中有兩個用逗號分隔的表。這會生成一個交叉連接。 –

+0

變量'@mercaderia'被定義爲INT。但是,您在乘法中使用小數。將@mercaderia的數據類型更改爲具有比例和精度的十進制或數字。 –

回答

2

計算運送商品的價值(箱數*重量* 0.5)的函數的我將放棄標量函數並將計算放入查詢中。這個標量函數只會讓你的查詢無緣無故地變慢。當然,正如編碼那樣,功能是一場災難。

不知道你是否真的想要交叉連接,或者如果這應該是一個內部/外部連接,但是這個代碼應該接近你想要的而沒有所有額外的功能麻煩。

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' 

--FINAL EDIT--

因爲你的老師想讓你看到的性能差異,那麼你應該使之成爲一個標量函數。這是你將如何做到這一點。

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

我發佈了這個問題,它會從這些車牌返回多個值 – BlindSteven92

+0

謝謝:)。它的工作原理,但我需要一個功能 – BlindSteven92

+0

函數帶來的唯一好處是讓它變慢。 –