【问题标题】:CREATE FUNCTION IN SQL select intoCREATE FUNCTION IN SQL select into
【发布时间】:2020-04-14 20:27:58
【问题描述】:

我正在尝试创建以下函数,但我不能

CREATE function pse_consecutivosiif (
    @empresa NUMERIC
    , @comprobante NUMERIC
    , @tercero NUMERIC
) 
returns NUMERIC
as    
BEGIN
    DECLARE i_consecutividad NUMERIC(5);

    select max(consecutividad) 
    into i_consecutividad
    from (
        select hojaIdenti cedula
            , dense_rank() over (order by  hojaIdenti) as consecutividad
        FROM movimiento MO
        INNER JOIN VISTADOS VIS ON MO.identifica = VIS.identifica
            AND MO.empresa = VIS.empresa
        WHERE MO.comprobante = @comprobante
            AND  MO.empresa = @empresa
    )
    where cedula = @tercero
    );

return i_consecutividad;
end;

【问题讨论】:

  • 为什么要同时标记 SQL Server 和 Oracle?
  • 我删除了 oracle 标记,因为这显然只是 SQL Server
  • 你为什么不能?包含错误消息以帮助对问题进行分类。

标签: sql-server tsql stored-functions


【解决方案1】:

注意事项:

  1. 你需要声明以@开头的变量
  2. 赋值不像select into,而是像下面的代码
  3. 如果使用子查询创建,总是需要提供表名

在下面找到工作函数

 CREATE function pse_consecutivosiif ( @empresa NUMERIC, @comprobante NUMERIC, @tercero NUMERIC) 
    returns NUMERIC
    as

    BEGIN
    DECLARE @i_consecutividad NUMERIC(5);

    select @i_consecutividad=max(consecutividad) 
     from (select hojaIdenti cedula, dense_rank() over (order by  hojaIdenti) as consecutividad
     FROM movimiento MO INNER JOIN VISTADOS VIS ON MO.identifica = VIS.identifica 
                                                                           AND MO.empresa = VIS.empresa
                                WHERE MO.comprobante = @comprobante
                                AND  MO.empresa = @empresa) y
    where y.cedula = @tercero


    return @i_consecutividad;
    end;

【讨论】:

  • 我相信还有一个多余的最后括号?
  • "提供表名" - 表别名。
【解决方案2】:

目前尚不清楚您的程序的目的是什么。但是,这里有一个更新版本,可以在 SQL Server 中正确编译。

create function pse_consecutivosiif (@empresa numeric, @comprobante numeric, @tercero numeric) 
returns numeric
as
begin
    declare @i_consecutividad numeric;
    select @i_consecutividad = max(consecutividad) 
    from (
        select 
            hojaidenti,
            cedula, 
            dense_rank() over (order by  hojaidenti) as consecutividad
        from movimiento mo 
        inner join vistados vis on mo.identifica = vis.identifica and mo.empresa = vis.empresa
        where mo.comprobante = @comprobante
        and  mo.empresa = @empresa
    ) t
    where cedula = @tercero;

    return @i_consecutividad;
end;

对原始代码的更改:

  • 变量声明时应以@开头

  • 您在查询的select 子句中为带有= 的变量赋值; select ... into ... 是为了创建一个新表,而不是分配给一个标量变量

  • 子查询需要别名

  • 代码末尾有一个多余的右括号

  • 适当的格式和缩进使代码更易于阅读

【讨论】:

  • 谢谢!!!!!!!这就是答案!!!!我需要在子查询中添加一个“别名”。非常感谢!
  • @ÁlvaroAlfonsoParraRodríguez:欢迎。考虑accepting 您收到的答案之一。这会奖励您和回答者,并向社区表明您的问题已得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2023-02-09
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多