代码之家  ›  专栏  ›  技术社区  ›  usman shaheen

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

  •  0
  • usman shaheen  · 技术社区  · 17 年前

    我将视图名作为表值函数中的参数传递,我希望通过构建动态SQL并由sp_executesql()执行,从该视图中获取一些数据。 当尝试执行函数时,我得到错误: 只能从函数内部执行函数和扩展存储过程。

    数据库管理系统: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 回复  |  直到 13 年前
        1
  •  1
  •   mwigdahl    17 年前

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

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

    您还可以使用其他方法,例如用数据预填充表变量、修改模式等等,这些方法将取决于您的性能要求和模式设置的方式。

        2
  •  0
  •   SQLMenace    17 年前

    否,除非您想通过调用扩展过程(如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代替函数?

    推荐文章