在调用动态SQL函数名(Call dynamic function name in SQL)

2019-09-17 04:11发布

是否有可能调用函数与SQL动态名字?

例如:

SELECT functionid, (SELECT results FROM dbo.Function_*functionid*) AS results
FROM List_of_Functions

这就需要一个不同的功能表中的List_of_Functions每一行。

或者,我会对此都错了?

Answer 1:

您将需要建立(或者键入它,或者动态地建立它的基础上你的表)这样一个SQL语句:

SELECT
    functionid
        ,CASE  functionid
            WHEN 1 THEN dbo.Function_1()
            WHEN 2 THEN dbo.Function_2()
            WHEN 3 THEN dbo.Function_3()
         END AS results
    FROM List_of_Functions

与其建造所有这些功能,那岂不是更好地建设一个功能,并传递一个值,该功能可以用来区分处理? 喜欢:

SELECT
    functionid
        ,dbo.Function(functionid) AS results
    FROM List_of_Functions_Parameters


Answer 2:

是否有可能调用函数与SQL动态名字?

不是纯SQL。

你可以做到这一点使用动态SQL,但并不是没有一定的风险,特别是的SQL注入 。

我建议您阅读的诅咒和动态SQL的祝福通过厄兰Sommarskog为主体的综合治疗。



Answer 3:

只是想延长和反对俄德的回答 :

是否有可能调用函数与SQL动态名字?

不是纯SQL。

你可以做到这一点使用动态SQL,但并不是没有一定的风险,特别是SQL注入。

是的,这是可能的,而无需使用动态SQL。

准备:

CREATE TABLE List_of_Functions(functionid INT);
INSERT INTO List_of_functions(functionid) VALUES(1),(2),(3),(4);

CREATE FUNCTION Function_1()
RETURNS VARCHAR(100)
AS
BEGIN
   RETURN 'Return from Function_1';
END;

CREATE FUNCTION Function_2()
RETURNS VARCHAR(100)
AS
BEGIN
   RETURN 'Return from Function_2';
END;

CREATE FUNCTION Function_3()
RETURNS VARCHAR(100)
AS
BEGIN
   RETURN 'Return from Function_3';
END;

核心功能:

CREATE FUNCTION Function_dispatcher(@name SYSNAME)
RETURNS VARCHAR(100)
AS
BEGIN
  DECLARE @r VARCHAR(100);
  IF OBJECT_ID(@name, N'FN') IS NULL  --handling non-existing function
    RETURN NULL;
  EXEC @r = @name; 
  RETURN @r;
END;

并最终调用:

SELECT *, dbo.Function_dispatcher(s.n) AS result
FROM List_of_Functions lf
OUTER APPLY(SELECT CONCAT('dbo.Function_', lf.functionid)) s(n);

DBFiddle演示

输出:

┌────────────┬────────────────┬────────────────────────┐
│ functionid │       n        │         result         │
├────────────┼────────────────┼────────────────────────┤
│          1 │ dbo.Function_1 │ Return from Function_1 │
│          2 │ dbo.Function_2 │ Return from Function_2 │
│          3 │ dbo.Function_3 │ Return from Function_3 │
│          4 │ dbo.Function_4 │ null                   │
└────────────┴────────────────┴────────────────────────┘

使用这种方法,就可以避免像改变主要功能,每次新的功能将出现(CASE WHEN ...)的KM。的答案



文章来源: Call dynamic function name in SQL