如何创建具有可变输入量的SQL函数?

时间:2018-12-21 15:27:41

标签: sql sql-server sql-server-2008

我正在寻找创建一个函数,该函数将任何表中的指定列连接到我的主表中。该函数的预期用途如下:

Select *
From [Main Table] A
Outer Apply get_Factor([Table1], [Column_Name], Col1, [Key1]                ) As [Factor_A]
Outer Apply get_Factor([Table2], [Column_Name], Col2, [Key2]                ) As [Factor_B] 
Outer Apply get_Factor([Table9], [Column_Name], Col1, [Key1], Col2, [Key2]) As [Factor_C]

该函数本质上是一个联接,但是我现在不知道使它具有动态数量的键。

CREATE FUNCTION [dbo].[get_Factor]
(   
  @Table_Name VARCHAR(10)
, @Column_Name VARCHAR(10)
/* not sure how to add a dynamic amount of keys here. There can be more than 3 keys. */
)
RETURNS TABLE 
AS
RETURN 
(
SELECT @Column_Name
FROM @Table_Name
WHERE @Col1 = @key1 And @Col2 = @key2 And @Col3 = @key3 /* ...etc */
)
GO

列应为字符串(例如“公司代码”),键应为主表中的变量(例如[公司代码])。

1 个答案:

答案 0 :(得分:1)

这个评论太长了。

您的代码没有工作的希望。您无法使用参数替换查询中的标识符,因此无法按预期使用@table_name@column_name

显而易见的解决方案是使用动态SQL。但是,SQL Server用户定义函数中不允许动态SQL。

有一些奥秘的选项可以解决此问题,例如:

  • 编写CLR函数以打开与SQL Server的新连接。为此,这太可笑了。
  • 使用存储过程,但是您不能在查询中使用该函数。

或者,找到其他方法来完成您想要的。糟糕的数据模型可能会导致您需要此功能,因此修复数据模型将简化查询。