使用许多参数调用UDF

时间:2017-12-02 15:04:04

标签: sql-server tsql

我正在创建一个导入过程,我最终需要SELECT几个字段以及一个计算值。计算值的逻辑相当复杂,我需要在UDF中而不是在SELECT本身中进行。

问题是计算出的值是由30-40列的内容决定的...我考虑过:

  • 具有30-40个输入参数的怪物功能。
  • 编写SP或C#应用程序以循环选定的数据。此选项可能不像其他选项那样具有前瞻性。
  • 将整个记录的内容作为JSON作为单个参数传递,并在我的UDF中提取相应的字段。我需要在选择中组合列和JSON,如图所示here

有什么想法可以提供更好的解决方案?我倾向于最后一个。

进一步恶化这种情况是数据不在我计划运行UDF的服务器上,并且该服务器较旧(不支持FOR JSON子句)。但我可以用OpenQuery()笨拙地解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以传递单个TVP(表值参数),而不是传递多个参数。

方法1:

CREATE TYPE MyTableType AS TABLE   
( param1 VARCHAR(50)  
, param2 INT
, param3 DATE );  

CREATE FUNCTION dbo.my_func(@tvp_params MyTAB)
RETURNS TABLE
AS RETURN (
     SELECT ...
     FROM ...
     JOIN @tvp_params ...
);

方法2:

CREATE TYPE myEAVTableType AS TABLE
(  param_id    INT
  ,param_name VARCHAR(128)
  ,param_value SQL_VARIANT);

在函数内部执行某种PIVOT