表值函数中的动态视图名称

时间:2009-04-22 11:49:52

标签: sql sql-server sql-server-2005

我在表值函数中传递View name作为参数,我想通过构建动态SQL并通过sp_executesql()执行它来从该视图中获取一些数据。 当我尝试执行该函数时,我收到错误: 只能在函数内执行函数和扩展存储过程。

DBMS:SQL Server 2005

任何解决方法?

set @SQLString = 
       N'select @Desc = Description from ' 
     + @TableName 
     + ' where Code = @Code;'

execute sp_executesql @SQLString, 
     N'@Code nvarchar(500), 
       @Desc nvarchar(500) OUTPUT', 
       @Code = @Code, 
       @Desc=@Desc OUTPUT;

2 个答案:

答案 0 :(得分:1)

好吧,您可以将动态SQL包装在扩展存储过程中。这可行,但我(强烈)建议不要这样做。

SQL Server要求用户定义的函数是确定性的(除了前面提到的扩展存储过程) - 即函数的结果应该从输入参数统一预测。由于存储过程可以从任何地方访问数据,使用随机数等,SQL Server将不允许您在函数内使用它们。

您可以使用其他方法,例如使用数据预先填充表变量,修改架构等等,这取决于您的性能要求以及如何设置架构。

答案 1 :(得分:0)

否,除非你想通过调用像xp_cmdshell

这样的扩展进程来进行环回查询

类似这样的东西,根据您的需要进行修改

CREATE FUNCTION fnBla(@id int)
RETURNS int
AS
BEGIN
DECLARE @SQL varchar(500)
SELECT @SQL='osql -S' +@@servername +' -E -q "exec tempdb..prLog ''fnBla''"'
EXEC master..xp_cmdshell @SQL
RETURN @id
END

这样你就知道我不会这样做,因为你正在创建一个环回查询而不是执行最安全的代码 你有什么理由不能使用proc而不是函数吗?