Неправильный синтаксис рядом с ключевым словом ‘if’, когда я пытаюсь использовать if в функции

#sql-server

#sql-server

Вопрос:

 create function cau3(@TenLop char(2))
returns @cau table(
    MaLop int,
    TenLop char(2),
    sl int
)
as
begin
declare @checked bit
select @checked =
    case when exists (select * from Lop where TenLop=@TenLop)
    then CAST(1 as bit)
    else cast(0 as bit)
    

if @checked=1
begin
    insert @cau
    select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop and Lop.TenLop=@TenLop
    group by Lop.MaLop, Lop.TenLop
end
else
begin
    insert @cau
    select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop
    group by Lop.MaLop, Lop.TenLop
end
end
  

я искал больше дня, но не нашел никаких решений: (( вы можете мне помочь? это так много.

я пытался использовать «if (exists (select» раньше, но также получил эту «ошибку», извините за мой плохой английский

Комментарии:

1. END отсутствует в CASE .

2. Здесь многое можно улучшить. Вам не нужно запрашивать и устанавливать @checked — простое «если существует … то … else …» делает именно то, что вам нужно, с меньшим количеством кода и меньшим риском. Вам не следует использовать объединения в старом стиле . У вас есть неиспользуемые параметры. Результирующий набор, сгенерированный двумя логическими ветвями, подозрителен и потенциально вводит в заблуждение потребителя результирующего набора.

Ответ №1:

Пропустил слово end в вашем случае выбора. И вам также нужно поставить return в конце функции.

Вот так

 create function cau3(@TenLop char(2))
returns @cau table(
  MaLop int,
  TenLop char(2),
  sl int
)
as
begin
declare @checked bit
   select @checked =
        case when exists (select * from Lop where TenLop=@TenLop)
            then CAST(1 as bit)
            else cast(0 as bit)
        end
    

    if @checked=1
    begin
        insert @cau
        select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop and Lop.TenLop=@TenLop
        group by Lop.MaLop, Lop.TenLop
    end
    else
    begin
        insert @cau
        select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop
        group by Lop.MaLop, Lop.TenLop
    end
    return
end
  

Комментарии:

1. Привет, @Iroha! Если у вас это сработало, пожалуйста, примите это как ответ.

2. Это следует обновить, чтобы использовать соединения ANSI (старый стиль устарел и существует уже более десяти лет), и использовать точки с запятой в конце инструкций. Сейчас уже не 2000 год.

3. извините всех, я попал в аварию, из-за которой я пролежал в больнице несколько месяцев. это работает, вам так нравится

Ответ №2:

 create function cau3(@TenLop char(2))
returns @cau table(
    MaLop int,
    TenLop char(2),
    sl int
)
as
begin
declare @checked bit
select @checked =
    (case when exists (select * from Lop where TenLop=@TenLop)
    then CAST(1 as bit)
    else cast(0 as bit)
    end)

if @checked=1
begin
    insert @cau
    select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop and Lop.TenLop=@TenLop
    group by Lop.MaLop, Lop.TenLop
end
else
begin
    insert @cau
    select Lop.MaLop, Lop.TenLop, count(MaSV) as sl from SV,LOP where SV.MaLop=Lop.MaLop
    group by Lop.MaLop, Lop.TenLop
end
end