2010-06-08 95 views
0

有完成類似如下的任何方式:動態SQL和功能

CREATE FUNCTION GetQtyFromID 
(
    @oricod varchar(15), 
    @ccocod varchar(15), 
    @ocmnum int, 
    @oinnum int, 
    @acmnum int, 
    @acttip char(2), 
    @unisim varchar(15) 
) 
AS 
RETURNS DECIMAL(18,8) 
BEGIN 
    DECLARE @Result decimal(18,8) 
    DECLARE @SQLString nvarchar(max); 
    DECLARE @ParmDefinition nvarchar(max); 

    --I need to execute a query stored in a cell which returns the calculated qty. 
    --i.e of AcuQry: select @cant = sum(smt) from table where oricod = @oricod and ... 

    SELECT  @SQLString = AcuQry 
    FROM  OinActUni 
    WHERE  (OriCod = @oricod) AND (ActTipCod = @acttip) AND (UniSim = @unisim) AND (AcuEst > 0) 

    SET @ParmDefinition = N' 
     @oricod varchar(15), 
     @ccocod varchar(15), 
     @ocmnum int, 
     @oinnum int, 
     @acmnum int, 
     @cant decimal(18,8) output'; 

    EXECUTE sp_executesql @SQLString, @ParmDefinition, 
      @oricod = @oricod, 
      @ccocod = @ccocod, 
      @ocmnum = @ocmnum, 
      @oinnum = @oinnum, 
      @acmnum = @acmnum, 
      @cant = @result OUTPUT; 

    RETURN @Result 

END 

這種方法的問題是,它是被禁止的函數來執行sp_excutesql ...

我需要的是做這樣的事情:

select id, getQtyFromID(id) as qty 
from table 

的主要思想是,以執行存儲在一個表格單元格的查詢,這是因爲事物的數量取決於它的設備上。單位可以是幾天,也可以是公噸,所以單位之間沒有關係,因此需要對每個單位進行具體查詢。

+1

爲什麼您將查詢存儲在列中,而不是使用存儲過程?無法保證運行動態SQL的帳戶對錶具有選擇權限,並且在查詢運行之前您不會知道問題。 – 2010-06-08 16:33:25

+0

@OMG。我已經添加了一些信息,請閱讀並告訴我您的想法。謝謝。 – Unlimited071 2010-06-08 16:40:18

回答

3

如何在存儲過程中使用if then或case表達式來檢查單元,然後根據單元的類型執行特定的計算?

+1

+1:我的想法正好 – 2010-06-08 17:06:38

+0

我可以,但SP會像1000 LOC一樣。如果沒有其他方法,我想我將不得不這樣做... – Unlimited071 2010-06-08 17:08:53

+1

(+1)@ Unlimited071:讓我們看看:一個1000 LOC s'proc,與將未知數量的查詢存儲爲記錄中的數據。如果表格定義發生變化,則需要追蹤和更新所有這些查詢。如果安全性發生變化,那麼你的擰緊。如果使用相同查詢的重複(最有可能)類型,那麼您可以獲得圖片。單個s'proc更容易維護。 – NotMe 2010-06-08 20:18:50