我在表值函数中传递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;
答案 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而不是函数吗?