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

Posted

技术标签:

【中文标题】如何在查询中使用变量和更改用户定义的函数【英文标题】:How to use variable and changing user defined functions in query 【发布时间】:2016-12-06 20:08:06 【问题描述】:

我在 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。

【问题讨论】:

SQL 查询不是为此而设计的。在这种情况下,光标可能是最好的方法。 光标?你能解释更多吗? 这是现实世界的需要吗?你想达到什么目的?我很确定,有更好的方法... 是的,这是一个真正的需求,我正在开发一个数据分析软件,我需要使用用户定义的函数来计算许多变量。 @Shnugo 我怀疑这是真实世界。我做了一些非常相似的事情,一次通过动态计算大量 LOB 的一系列财务比率。 【参考方案1】:

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

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

我过去做过非常类似的事情,可以一次性计算出大量收入/资产负债表的一系列比率

以下是一种方法。 (不过,我不是在挖掘这 2 个参数……似乎有点有限,但我相信您可以根据需要进行扩展)

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

【讨论】:

以上是关于如何在查询中使用变量和更改用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

在vue项目中 如何定义全局变量 全局函数

在vue项目中 如何定义全局变量 全局函数

如何在Devise中更改全局变量

如何在 sqlalchemy 查询过滤器中使用用户定义的 python 函数?

如何在 Google Bigquery 中创建动态更改数据集的查询?

jOOQ:如何在选择查询中调用 Sql 用户定义函数