CREATE FUNCTION IN SQL select into

Posted

技术标签:

【中文标题】CREATE 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 你为什么不能?包含错误消息以帮助对问题进行分类。 【参考方案1】:

注意事项:

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

在下面找到工作函数

 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 您收到的答案之一。这会奖励您和回答者,并向社区表明您的问题已得到解决。

以上是关于CREATE FUNCTION IN SQL select into的主要内容,如果未能解决你的问题,请参考以下文章