为什么在标量值函数中使用动态sql时,出现查询错误:"只有函数和扩展存储过程才能从函数内部执行。" 测试实例如下: ALTER FUNCTION [dbo].[fx_rpt] 

) RETURNS decimal(18,2) AS 
BEGIN 
declare @rtn decimal(18,2) 
declare @strsql nvarchar(max) 
set @strsql='set @strsql='select @x=count(*) from subject' 
exec sp_executesql @strsql,N'@x int output',@rtn output 
return @rtn 
END 
GO 
select dbo.fx_rpt时提示: "只有函数和扩展存储过程才能从函数内部执行。" 

解决方案 »

  1.   

    函數內不可以用sp_executesql可改為存儲過程
      

  2.   

    create proc [dbo].[fx_rpt]
    @rtn decimal(18,2)
    ASdeclare @strsql nvarchar(max)
    set @strsql='select @x=count(*) from subject'
    exec sp_executesql @strsql,N'@x int output',@rtn output
    GO 
      

  3.   

    动态SQL不能在function中运行,如果可能的话换成存储过程吧
      

  4.   

    我想实现的目的是,构造一个函数,如fx_val(@fieldname,@val),由于存在动态字段,在函数中就采用了动态SQL的方法,为取得返回值,使用了sp_executesql ,如果采用存贮过程可能达不到函数的效果,不知道有没有更好的办法?
      

  5.   

    以下摘自SQL Server联机丛书多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。 赋值语句。
    控制流语句。
    DECLARE 语句,该语句定义函数局部的数据变量和游标。
    SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
    游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
    INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
    EXECUTE 语句调用扩展存储过程。