2010-06-08 98 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