1

在我正在移植到 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 服务器可能是我试图从表变量中选择的东西。

编辑时:是的,我不需要在函数中执行此操作,我可以运行存储过程,我只是之前没有编写过它们中的任何一个。

4

6 回答 6

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

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

这有效,尽管它不是 UDF。

于 2008-12-08T16:37:23.903 回答
2

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

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

于 2008-12-08T16:36:56.137 回答
0

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

很抱歉,我很确定不可能在函数中执行此操作。

如果您正在使用存储过程,那将是可能的。

于 2008-12-08T16:43:30.490 回答
0

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

于 2008-12-08T17:14:57.010 回答
0

我希望能够处理的表数量有限,因此我可以使用 IF 编写一些东西,测试 @template 是否与多个值匹配,并为每个匹配运行

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

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

于 2008-12-08T17:33:24.133 回答
0

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

于 2008-12-08T17:59:08.683 回答