在我正在移植到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,我之前没有写过任何一个。
答案 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)
如果您有许多具有相同结构的表,通常意味着您没有以正常形式设计数据库。您应该将这些统一到一个表中。您可能需要为此表添加一个属性列以区分数据集。