如何从UDF参数提供SELECT语句的FROM子句

时间:2008-12-08 16:30:36

标签: sql sql-server user-defined-functions

在我正在移植到Web的应用程序中,我们当前在运行时从运行到运行动态访问不同的表,基于指定的“模板”字符串。我想将这样做的负担转移回数据库,因为我们正在迁移到SQL服务器,因此我不必乱用动态GridView。我想过编写一个表值UDF,其中包含一个表名参数和一个查询WHERE子句的参数。

我为我的UDF输入了以下内容,但显然它不起作用。有没有办法获取某种类型的varchar或字符串并获得可以在FROM子句中使用的表引用?

CREATE FUNCTION TemplateSelector 
(   
@template varchar(40),
@code varchar(80)
)
RETURNS TABLE 
AS
RETURN 
(
SELECT * FROM @template WHERE ProductionCode = @code
)

或者其他一些方法来获得与此概念类似的结果集。基本上varchar @template指示的表中的所有记录都与@code的匹配ProductionCode。

我收到错误“必须声明表变量”@template“”,所以SQL服务器可能是我试图从表变量中选择的东西。

On Edit:是的我不需要在函数中执行它,我可以运行Stored Procs,我之前没有写过任何一个。

6 个答案:

答案 0 :(得分:4)

CREATE PROCEDURE TemplateSelector 
(   
    @template varchar(40),
    @code varchar(80)
)

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)

这可行,但它不是UDF。

答案 1 :(得分:2)

执行此操作的唯一方法是使用exec命令。

此外,您必须将其移出存储过程而不是函数。显然函数无法执行动态sql。

答案 2 :(得分:0)

唯一可行的方法是使用动态SQL,但是,函数中的SqlServer不支持动态SQL。

我很遗憾地说,我很确定在一个功能中不可能这样做。

如果您正在使用存储过程,则可能。

答案 3 :(得分:0)

此外,应该注意的是,要替换查询中的表名,您已经破坏了SQL Server缓存查询执行计划的能力。这几乎降低了使用UDF或SP的优势。您也可以直接调用SQL查询。

答案 4 :(得分:0)

我希望能够解决有限数量的表格,因此我可以使用IF编写一些内容,测试@template以获取具有多个值的匹配以及每次匹配运行

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

听起来这是一个更好的选择

答案 5 :(得分:0)

如果您有许多具有相同结构的表,通常意味着您没有以正常形式设计数据库。您应该将这些统一到一个表中。您可能需要为此表添加一个属性列以区分数据集。