СОЗДАТЬ ФУНКЦИЮ В SQL выберите в - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать следующую функцию, но не могу

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;

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Обратите внимание:

  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;
0 голосов
/ 14 апреля 2020

Неясно, какова цель вашей процедуры. Однако вот обновленная версия, которая правильно компилируется в 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 ... предназначен для создания новой таблицы, а не для присвоения скалярной переменной

  • для подзапроса требуется псевдоним

  • есть лишние закрывающие скобки в конце кода

  • правильное форматирование и отступ облегчают чтение кода

...