如何在查询中使用变量和更改用户定义的函数

时间:2016-12-06 20:08:07

标签: sql sql-server function sql-server-2014 user-defined-functions

我在sql server中定义了一些用户定义的函数。例如:

select dbo.SumItems(1 , 2)将返回3

select dbo.MaxItems(5 , 3)将返回5

和其他一些功能可能会更复杂。 我还将变量及其公式表达式保存在表中:

IdVar Title Formula 
----- ----- ---------------------
1     Sum   dbo.SumItems(@a , @b)
2     Max   dbo.maxItems(@a , @b)

我的参数在另一张表中:

a   b
--  --
1   2
5   3

现在我想加入这两个表并获得以下结果:

Parameter a   Parameter b  Variable Title  Result
-----------   -----------  --------------  ------
1             2            Sum             3
1             2            Max             2
5             3            Sum             8
5             3            Max             5

我也从另一个视图here询问了我的问题。

1 个答案:

答案 0 :(得分:1)

昨天发布了与此类似的内容。如您所知,您只能使用动态sql执行此类功能。

现在,我没有你的功能,所以你必须提供这些功能。

我过去曾做过非常相似的事情来计算一次通过多个收入/资产负债表的一系列比率

以下是一种方法。 (但是,我没有挖掘这两个参数......似乎有点受限,但我确定你可以根据需要进行扩展)

Declare @Formula table (ID int,Title varchar(25),Formula varchar(max))
Insert Into @Formula values
 (1,'Sum'     ,'@a+@b')
,(2,'Multiply','@a*@b')

Declare @Parameter table (a varchar(50),b varchar(50))
Insert Into @Parameter values
(1,2),
(5,3)

Declare @SQL varchar(max)=''
;with cte as (
Select A.ID
      ,A.Title
      ,ParameterA = A
      ,ParameterB = B
      ,Expression = Replace(Replace(Formula,'@a',a),'@b',b)
 From  @Formula A 
 Cross Join @Parameter B
)
Select  @SQL = @SQL+concat(',(',ID,',',ParameterA,',',ParameterB,',''',Title,''',(',Expression,'))') From cte 
Select  @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,ParameterA,ParameterB,Title,Value)'
Exec(@SQL)

-- Optional To Trap Results in a Table Variable 
--Declare @Results table (ID int,ParameterA varchar(50),ParameterB varchar(50),Title varchar(50),Value float)
--Insert Into @Results Exec(@SQL)
--Select * from @Results

返回

ID  ParameterA  ParameterB  Title      Value
1   1           2           Sum         3
2   1           2           Multiply    2
1   5           3           Sum         8
2   5           3           Multiply    15