【问题标题】:Microsoft t sql how to declare temporary variable within user defined function?Microsoft t sql如何在用户定义的函数中声明临时变量?
【发布时间】:2019-10-15 00:13:02
【问题描述】:

那么如何在用户声明的函数中声明一个临时局部变量,声明如下:declare @tempVar varchar(max)? 我在这里试图解决的实际问题是在用户定义的存储函数中声明和使用变量。我这样声明我的函数:

create function someFunction(@someParam varchar(100))
returns table
as 
return (
    declare @tempvar varchar(100)
    set @tempvar = ''--Set the var to something useful
    select * from sometable where somecolumn = (
        select top 1 someColumn
        from sometable
        where somecolumn = @tempvar
    )
)

服务器抱怨变量被声明在错误的位置。我应该在哪里像这样在 UDF 中声明我的变量?

【问题讨论】:

  • 你不能。子查询被优化为它们所属的整个查询的一部分。它们没有作为单独的步骤处理,因此没有意义。如果您能解释您拥有哪些数据以及您要解决什么问题,我们或许可以提供帮助。
  • @Damien_The_Unbeliever 查看编辑。
  • 在 UDF 中声明一个变量是微不足道的 - 你写 declare @var type 就完成了。但是您最初要求在 子查询 中执行此操作。这就是需要更多解释您要实现的目标的地方。也许如果您提供了一些示例数据并解释了 UDF 的计算用途,我们可以为您提供帮助。
  • @Damien_The_Unbeliever 再次编辑。

标签: sql tsql sql-server-2014


【解决方案1】:

您正在创建一个内联表值函数,这种函数必须只包含一个SELECT 语句。

如果你想使用变量,你必须创建一个多语句表值函数。您的函数将被声明为:

create function someFunction(@someParam varchar(100))
returns @table (field1 type, field2 type, ...)
as 
begin
    declare @tempvar varchar(100)
    set @tempvar = ''--Set the var to something useful
    insert @table
    select * from sometable where somecolumn = (
        select top 1 someColumn
        from sometable
        where somecolumn = @tempvar
    )
    return
end

【讨论】:

  • 哦,我明白了。以前没用过微软数据库,只用过postgres。
【解决方案2】:

如果您想保持表格函数内联,您可以使用通用表格表达式来定义您的变量,如下所示:

create function someFunction(@someParam varchar(100))
returns table
as 
return (
  WITH cte (tempvar) AS
    (
    SELECT '' -- Set the var to something useful
    )
    select * from sometable where somecolumn = (
        select top 1 someColumn
        from sometable
          JOIN cte ON 1=1
        where somecolumn = cte.tempvar
    )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多