Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从UDF参数提供SELECT语句的FROM子句_Sql_Sql Server_User Defined Functions - Fatal编程技术网

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

Sql 如何从UDF参数提供SELECT语句的FROM子句,sql,sql-server,user-defined-functions,Sql,Sql Server,User Defined Functions,在我正在进行web移植的应用程序中,我们当前根据指定的“模板”字符串,在运行时从一个运行到另一个运行动态访问不同的表。现在我们要转到SQL server,我想把这样做的负担移回到数据库上,这样我就不必再处理动态GridView了。我考虑编写一个表值UDF,其中一个参数用于表名,另一个参数用于查询WHERE子句 我为我的UDF输入了以下内容,但显然它不起作用。有没有办法获取某种类型的varchar或字符串,并获取可以在FROM子句中工作的表引用 CREATE FUNCTION TemplateSe

在我正在进行web移植的应用程序中,我们当前根据指定的“模板”字符串,在运行时从一个运行到另一个运行动态访问不同的表。现在我们要转到SQL server,我想把这样做的负担移回到数据库上,这样我就不必再处理动态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 server可能是我试图从表变量中选择的内容


编辑:是的,我不需要在函数中进行编辑,我可以运行存储的进程,我只是以前没有编写过任何程序。

唯一的方法是使用exec命令


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

唯一的方法是使用exec命令

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

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)
此外,您还必须将其移出到存储的进程,而不是函数。显然函数不能执行动态sql

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

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)
这是可行的,尽管它不是UDF


这是可行的,尽管它不是UDF。

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

很抱歉,我很确定在函数中不可能做到这一点


如果您使用的是存储过程,这是可能的。

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

很抱歉,我很确定在函数中不可能做到这一点


如果您使用的是存储过程,这是可能的。

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

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

我希望能够处理的表数量有限,因此我可以使用IF编写一些东西,它可以测试@template中具有多个值的匹配项以及每个匹配项的运行情况

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

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

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

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code


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

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

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

要么如此,要么sp_executesql。但你是对的。您必须使用动态SQL。要么使用动态SQL,要么使用sp_executesql。但你是对的。您必须使用动态SQL。危险将是robinson!检测到sql注入!:P@Chris活泼-好久不见男人了!你怎么会在这条声名狼藉的行里工作?这对我很有用。而且提供的模板值是从下拉列表中选择的,所以我认为它不能被注入。编辑很容易被SQL注入,特别是如果它是一个web应用程序。下拉菜单不起保护作用。危险威尔·罗宾逊!检测到sql注入!:P@Chris活泼-好久不见男人了!你怎么会在这条声名狼藉的行里工作?这对我很有用。而且提供的模板值是从下拉列表中选择的,所以我认为它不能被注入。编辑很容易被SQL注入,特别是如果它是一个web应用程序。下拉列表没有保护功能。如果您打算采用这种方法(比动态SQL好一百倍),并且将其封装在SP中而不是在前端进行测试,那么请确保在存储过程中使用WITH RECOMPLE选项。否则,由于缓存计划将关闭,性能可能会受到影响。如果要采用此方法(比动态SQL好一百倍),并且要将其封装在SP中,而不是在前端进行测试,请确保在存储过程中使用WITH RECOMPLE选项。否则性能可能会受到影响,因为缓存的计划将关闭。它们没有相同的结构,它们都有ProductionCode和TestTime,但在这之后,每个都有自己的数据它们没有相同的结构,它们都有ProductionCode和TestTime,但在这之后,每个都有自己的数据缓存执行计划的优点不是UDF或SP的主要优点。缓存执行计划的优点不是UDF或SP的主要优点。