在Execute语句中调用用户定义的标量函数

时间:2012-09-21 16:33:22

标签: sql sql-server

  

可能重复:
  Cast integer and concatenate to varchar in TSQL

我创建了两个标量函数,每个函数都返回uniqueidentifer个类型。我需要在execute语句中调用这些过程,但我似乎有错误的语法。

Exec spModifyProductPropertyValue 
     @PAVID, 
     fnGetPropertyIDbyLabel(@Label7, @USPID, 0, 1), 
     @ProductID, 
     @Value7, 
     fnGetPINID(@7PIN), 
     0, 
     @counter out

我注意到当我单独调用该函数然后在上面的调用中使用前一个调用的输出时,就像这样

Declare
      @PropertyID as uniqueidentifier = null

Select @PropertyID = fnGetPropertyIDbyLabel(@Label7, @USPID, 0, 1)

Exec spModifyProductPropertyValue 
         @PAVID, 
         @PropertyID, 
         @ProductID, 
         @Value7, 
         fnGetPINID(@7PIN), 
         0, 
         @counter out

编译器不会抱怨太多。这种方法的问题在于我最终创建了这么多的临时变量(差不多50个),这是我想要避免的。如果能得到正确的帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

UDF的语法是

expression... function_name(value_1, value_2, ... value_n)...

所以,你只能传递值,而不是表达式。

因为使用函数是一个表达式, 在调用另一个函数

     Exec spModifyProductPropertyValue 
     @PAVID, 
     dbo.fnGetPropertyIDbyLabel(@Label7, @USPID, 0, 1) as GetPropertyID,  --Expression
     (..)

是不可能的。

所以,是的,你必须创建变量。但是如果所有都是int,也许你可以创建一个并在每次使用函数时使用它。 或者修改你的函数只做两个函数所做的事情。

答案 1 :(得分:-1)

您需要拥有者前缀:

Exec spModifyProductPropertyValue 
     @PAVID, 
     dbo.fnGetPropertyIDbyLabel(@Label7, @USPID, 0, 1) as GetPropertyID, 
     @ProductID, 
     @Value7, 
     dbo.fnGetPINID(@7PIN) as GetPINID, 
     0, 
     @counter out

Awnser在这里:SQL User Defined Function Within Select