4

是否可以在 SQL 中调用具有动态名称的函数?

例如:

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

这将为表 List_of_Functions 中的每一行调用不同的函数。

还是我对这一切都错了?

4

3 回答 3

3

您将需要构建(键入它,或者根据您的表动态构建它)一个 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
于 2012-05-11T19:48:11.597 回答
2

是否可以在 SQL 中调用具有动态名称的函数?

不在纯 SQL 中。

您可以使用动态 SQL 来实现这一点,但并非没有风险,尤其是SQL 注入

我建议阅读Erland Sommarskog 的The Curse and Blessings of Dynamic SQL以全面了解该主题。

于 2012-05-11T19:13:31.270 回答
1

只是想扩展和反对Oded 的回答

是否可以在 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.'s answer

于 2018-06-09T11:25:26.957 回答