Tsql 动态SQL和函数

Tsql 动态SQL和函数,tsql,stored-procedures,function,dynamic-sql,Tsql,Stored Procedures,Function,Dynamic 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 de

是否有任何方法可以实现以下目标:

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

其主要思想是执行存储在表单元格中的查询,这是因为某些东西的数量取决于它的单位。单位可以是天,也可以是公吨,因此单位之间没有关系,因此需要对每个单位进行特定查询。

在存储过程中使用if-then或case表达式检查单位如何,然后根据单元类型执行特定计算?

在存储过程中使用if-then或case表达式检查单元,然后根据单元类型执行特定计算,怎么样?

为什么要将查询存储在列中,而不是使用存储过程?无法保证运行动态SQL的帐户对表具有select权限,在查询运行之前,您不会知道有问题。@OMG。我添加了一些信息,请阅读并告诉我你的想法。谢谢。为什么要将查询存储在列中,而不是使用存储过程?无法保证运行动态SQL的帐户对表具有select权限,在查询运行之前,您不会知道有问题。@OMG。我添加了一些信息,请阅读并告诉我你的想法。谢谢。我可以,但是SP大约是1000 LOC。如果没有其他方法,我想我将不得不这样做…(+1)@Unlimited071:让我们看看:一个1000 LOC的进程,而不是将未知数量的查询作为数据存储在记录中。如果表定义发生更改,则需要跟踪并更新所有这些查询。如果安全性发生变化,那么你就完蛋了。如果存在使用同一查询的重复(最有可能)类型,那么,您将了解情况。一个s'proc更易于维护。我认为,如果像这样的问题在tsql中没有得到解决,那一定是有原因的,是不是上述任何一个原因,我不知道;但我知道这一定是一个很好的理由。谢谢你们的回复和时间,我想我会选择巨大的s'proc。为了听取其他的选择(如果有的话),我会在这一天不回答这个问题。我可以,但SP会像1000 LOC一样。如果没有其他方法,我想我将不得不这样做…(+1)@Unlimited071:让我们看看:一个1000 LOC的进程,而不是将未知数量的查询作为数据存储在记录中。如果表定义发生更改,则需要跟踪并更新所有这些查询。如果安全性发生变化,那么你就完蛋了。如果存在使用同一查询的重复(最有可能)类型,那么,您将了解情况。一个s'proc更易于维护。我认为,如果像这样的问题在tsql中没有得到解决,那一定是有原因的,是不是上述任何一个原因,我不知道;但我知道这一定是一个很好的理由。谢谢你们的回复和时间,我想我会选择巨大的s'proc。为了听取其他的选择(如果有的话),我会把这个问题留到今天不回答。