是否有可能调用函数与SQL动态名字?
例如:
SELECT functionid, (SELECT results FROM dbo.Function_*functionid*) AS results
FROM List_of_Functions
这就需要一个不同的功能表中的List_of_Functions每一行。
或者,我会对此都错了?
是否有可能调用函数与SQL动态名字?
例如:
SELECT functionid, (SELECT results FROM dbo.Function_*functionid*) AS results
FROM List_of_Functions
这就需要一个不同的功能表中的List_of_Functions每一行。
或者,我会对此都错了?
您将需要建立(或者键入它,或者动态地建立它的基础上你的表)这样一个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
是否有可能调用函数与SQL动态名字?
不是纯SQL。
你可以做到这一点使用动态SQL,但并不是没有一定的风险,特别是的SQL注入 。
我建议您阅读的诅咒和动态SQL的祝福通过厄兰Sommarskog为主体的综合治疗。
只是想延长和反对俄德的回答 :
是否有可能调用函数与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。的答案