2008-12-08 78 views
1

在应用程序中,我正在移植到Web上,我们当前在运行时根据“模板”动态地从运行时动态访问不同的表,指定的字符串。现在我们正在转向SQL服务器,因此我想将这样做的负担移回数据库,所以我不必惹恼动态的GridView。我想写一个表值的UDF,其中一个参数用于表名,一个用于查询WHERE子句。如何从UDF参数中提供SELECT语句的FROM子句

我为我的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的生产码相匹配。

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

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

回答

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

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

虽然这不是UDF,但它可以工作。

+0

工作危险将鲁宾逊!检测到sql注入! :P – annakata 2008-12-08 16:40:00

+0

这不行! – 2008-12-08 16:44:00

+0

@Chris Lively - 好久不见人!无论如何,你怎么会在这个不可靠的工作中结束呢? – 2008-12-08 16:46:40

2

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

此外,你必须将它移出存储过程而不是函数。显然,函数不能执行动态sql。

+0

可以是,也可以是sp_executesql。但是,是的,你是对的。你必须使用动态SQL。 – 2008-12-08 16:38:32

+0

重要的是要指出,无论与功能 – 2008-12-08 16:44:30

0

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

我很抱歉地说,我很确定在一个函数中不可能这样做。

如果你正在使用存储过程,这是可能的。

0

另外,应该注意的是,要替换查询中的表名,您已经销毁了SQL Server缓存查询执行计划的能力。这几乎减少了使用UDF或SP的优势。您不妨直接调用SQL查询。

0

我有,我希望能够解决表的数量有限,所以我可以写使用IF的东西,即测试@Template火柴与多家值和每场比赛跑

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code 

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

0

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