【问题标题】:Assign function result to a table variable将函数结果分配给表变量
【发布时间】:2010-10-02 15:03:02
【问题描述】:

SQL Server (2000/2005) 函数获取表名和字段名作为参数,并从函数内的动态查询返回结果。结果应分配给Table 变量,该变量将在存储过程中进一步使用。如何做到这一点?

我收到错误消息:“只能在函数内执行函数和扩展存储过程。”

Declare @Data as table (FieldValue varchar(100))
insert into @Data select * from MyFunction ('Person.Address','AddressID')     

-- Function
Alter function MyFunction (
   @TableName varchar(100), @FieldName varchar(100) 
) returns @GetData table (
   FieldValue  varchar(100) 
) as
begin
        Declare @SQL varchar(250)
        Set @SQL = 'Select '+@FieldName+ ' from '+ @TableName
        Exec sp_executesql @SQL     
        return
end

【问题讨论】:

  • -1。不要这样使用动态Sql。参考 sommarskog:sommarskog.se/dynamic_sql.html
  • +1。 @David:他在问,没必要因为他错了而投反对票。

标签: sql stored-procedures dynamic-queries


【解决方案1】:

只是为了结束循环......

这是调用函数并将这些结果放入表变量的语法

基于@simons 解决方案的小型构建

这在 sql2012 和 sql2014 上运行。

[ 不要忘记关闭 table 语句。如果您将表格全部放在一行上,这很容易做到。 ]

declare @t table(field1  nvarchar(100) )

insert @t select * from dbo.Cool_1Field_Function( 'parm1' ,'parm2')
select * from @t

【讨论】:

  • 这应该是正确的答案。它是唯一一个使用函数而不是过程的函数。
  • 太糟糕了,你不能这样做:declare @t table(field1 nvarchar(100) ) = dbo.Cool_1Field_Function( 'parm1' ,'parm2')
  • @costa,将它添加到“如果......会很酷的东西”列表中。我有一个合理的 sql 列表 :-)
【解决方案2】:

我不确定这如何与函数一起使用,但如果您有一个返回结果集的存储过程,您可以使用 INSERT EXEC 语句将其插入到表变量中。

INSERT @TableVariable
EXEC spYourProcedure

只要字段匹配即可。否则你可以使用:

INSERT @TableVariable (FieldInSp1, FieldInSp2)
EXEC spYourProcedure

这样您就可以在存储过程之间传递数据。有关更多信息,请参阅INSERT EXEC Statements 上的此页面。

【讨论】:

    【解决方案3】:

    您不能在用户定义的函数中使用“exec”。 UDF 必须没有副作用。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2013-11-12
      • 1970-01-01
      • 2022-07-02
      • 2011-10-22
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多